From 5cf62c0e0ff25692d2c91fe581695035753c7390 Mon Sep 17 00:00:00 2001 From: bird Date: Fri, 15 Sep 2006 02:04:16 +0000 Subject: [PATCH] recreating vendor branches. git-svn-id: https://www.virtualbox.org/svn/kbuild-mirror/tags/MAKE_3-81-rc1_CVS_2003-11-23@491 1093d150-e988-4e3a-8fd4-90e8b09e91e5 --- src/gmake/.cvsignore | 32 - src/gmake/.purify | 12 - src/gmake/AUTHORS | 57 - src/gmake/ChangeLog | 1195 --- src/gmake/ChangeLog.1 | 4980 ---------- src/gmake/ChangeLog.2 | 6633 ------------- src/gmake/INSTALL | 187 - src/gmake/Makefile.DOS.template | 533 - src/gmake/Makefile.am | 167 - src/gmake/Makefile.ami | 305 - src/gmake/NEWS | 880 -- src/gmake/NMakefile.template | 124 - src/gmake/README.Amiga | 61 - src/gmake/README.DOS.template | 323 - src/gmake/README.OS2.template | 159 - src/gmake/README.W32.template | 241 - src/gmake/README.customs | 95 - src/gmake/README.cvs | 113 - src/gmake/README.template | 164 - src/gmake/SCOPTIONS | 13 - src/gmake/SMakefile.template | 213 - src/gmake/TODO.private | 140 - src/gmake/acinclude.m4 | 164 - src/gmake/alloca.c | 503 - src/gmake/amiga.c | 121 - src/gmake/amiga.h | 22 - src/gmake/ar.c | 310 - src/gmake/arscan.c | 840 -- src/gmake/build.template | 83 - src/gmake/build_w32.bat | 142 - src/gmake/commands.c | 587 -- src/gmake/commands.h | 42 - src/gmake/config.ami.template | 317 - src/gmake/config.h-vms.template | 403 - src/gmake/config.h.W32.template | 399 - src/gmake/config/.cvsignore | 4 - src/gmake/config/ChangeLog | 19 - src/gmake/config/Makefile.am | 7 - src/gmake/configh.dos.template | 94 - src/gmake/configure.bat | 44 - src/gmake/configure.in | 394 - src/gmake/debug.h | 41 - src/gmake/default.c | 591 -- src/gmake/dep.h | 78 - src/gmake/dir.c | 1200 --- src/gmake/doc/.cvsignore | 7 - src/gmake/doc/Makefile.am | 20 - src/gmake/doc/make.texi | 10323 -------------------- src/gmake/dosbuild.bat | 42 - src/gmake/expand.c | 580 -- src/gmake/file.c | 821 -- src/gmake/filedef.h | 199 - src/gmake/function.c | 2023 ---- src/gmake/getloadavg.c | 1030 -- src/gmake/getopt.c | 1030 -- src/gmake/getopt.h | 133 - src/gmake/getopt1.c | 180 - src/gmake/gettext.h | 59 - src/gmake/glob/.cvsignore | 2 - src/gmake/glob/COPYING.LIB | 481 - src/gmake/glob/ChangeLog | 142 - src/gmake/glob/Makefile.am | 14 - src/gmake/glob/Makefile.ami | 69 - src/gmake/glob/SCOPTIONS | 13 - src/gmake/glob/SMakefile | 69 - src/gmake/glob/configure.bat | 26 - src/gmake/glob/fnmatch.c | 488 - src/gmake/glob/fnmatch.h | 84 - src/gmake/glob/glob.c | 1428 --- src/gmake/glob/glob.h | 209 - src/gmake/hash.c | 333 - src/gmake/hash.h | 233 - src/gmake/implicit.c | 630 -- src/gmake/job.c | 3479 ------- src/gmake/job.h | 104 - src/gmake/main.c | 2835 ------ src/gmake/maintMakefile | 233 - src/gmake/make.1 | 291 - src/gmake/make.h | 593 -- src/gmake/make.lnk | 5 - src/gmake/makefile.com | 138 - src/gmake/makefile.vms | 147 - src/gmake/misc.c | 830 -- src/gmake/po/.cvsignore | 6 - src/gmake/po/ChangeLog | 29 - src/gmake/po/LINGUAS | 5 - src/gmake/po/Makevars | 41 - src/gmake/po/POTFILES.in | 25 - src/gmake/read.c | 3112 ------ src/gmake/readme.vms | 183 - src/gmake/remake.c | 1416 --- src/gmake/remote-cstms.c | 302 - src/gmake/remote-stub.c | 101 - src/gmake/rule.c | 603 -- src/gmake/rule.h | 61 - src/gmake/signame.c | 251 - src/gmake/subproc.bat | 6 - src/gmake/tests/.cvsignore | 1 - src/gmake/tests/COPYING | 339 - src/gmake/tests/ChangeLog | 407 - src/gmake/tests/NEWS | 161 - src/gmake/tests/README | 79 - src/gmake/tests/mkshadow | 42 - src/gmake/tests/run_make_tests | 2 - src/gmake/tests/run_make_tests.pl | 274 - src/gmake/tests/scripts/features/comments | 35 - src/gmake/tests/scripts/features/conditionals | 100 - src/gmake/tests/scripts/features/default_names | 65 - src/gmake/tests/scripts/features/double_colon | 127 - src/gmake/tests/scripts/features/echoing | 90 - src/gmake/tests/scripts/features/errors | 93 - src/gmake/tests/scripts/features/escape | 60 - src/gmake/tests/scripts/features/export | 250 - src/gmake/tests/scripts/features/include | 61 - src/gmake/tests/scripts/features/mult_rules | 78 - src/gmake/tests/scripts/features/mult_targets | 46 - src/gmake/tests/scripts/features/order_only | 112 - src/gmake/tests/scripts/features/override | 34 - src/gmake/tests/scripts/features/parallelism | 100 - src/gmake/tests/scripts/features/patspecific_vars | 64 - src/gmake/tests/scripts/features/quoting | 32 - src/gmake/tests/scripts/features/recursion | 61 - src/gmake/tests/scripts/features/reinvoke | 86 - src/gmake/tests/scripts/features/statipattrules | 72 - src/gmake/tests/scripts/features/targetvars | 270 - src/gmake/tests/scripts/features/varnesting | 34 - src/gmake/tests/scripts/features/vpath | 62 - src/gmake/tests/scripts/features/vpath2 | 45 - src/gmake/tests/scripts/features/vpathgpath | 66 - src/gmake/tests/scripts/features/vpathplus | 128 - src/gmake/tests/scripts/functions/addprefix | 44 - src/gmake/tests/scripts/functions/addsuffix | 36 - src/gmake/tests/scripts/functions/basename | 44 - src/gmake/tests/scripts/functions/call | 99 - src/gmake/tests/scripts/functions/dir | 44 - src/gmake/tests/scripts/functions/error | 63 - src/gmake/tests/scripts/functions/eval | 137 - src/gmake/tests/scripts/functions/filter-out | 28 - src/gmake/tests/scripts/functions/findstring | 47 - src/gmake/tests/scripts/functions/foreach | 53 - src/gmake/tests/scripts/functions/if | 33 - src/gmake/tests/scripts/functions/join | 44 - src/gmake/tests/scripts/functions/notdir | 44 - src/gmake/tests/scripts/functions/origin | 66 - src/gmake/tests/scripts/functions/sort | 55 - src/gmake/tests/scripts/functions/strip | 57 - src/gmake/tests/scripts/functions/substitution | 37 - src/gmake/tests/scripts/functions/suffix | 57 - src/gmake/tests/scripts/functions/value | 30 - src/gmake/tests/scripts/functions/warning | 63 - src/gmake/tests/scripts/functions/wildcard | 105 - src/gmake/tests/scripts/functions/word | 91 - src/gmake/tests/scripts/misc/general1 | 51 - src/gmake/tests/scripts/misc/general2 | 50 - src/gmake/tests/scripts/misc/general3 | 58 - src/gmake/tests/scripts/misc/general4 | 31 - src/gmake/tests/scripts/options/dash-B | 43 - src/gmake/tests/scripts/options/dash-C | 48 - src/gmake/tests/scripts/options/dash-I | 57 - src/gmake/tests/scripts/options/dash-e | 24 - src/gmake/tests/scripts/options/dash-f | 85 - src/gmake/tests/scripts/options/dash-k | 100 - src/gmake/tests/scripts/options/dash-l | 55 - src/gmake/tests/scripts/options/dash-n | 70 - src/gmake/tests/scripts/options/dash-q | 70 - src/gmake/tests/scripts/options/dash-t | 58 - src/gmake/tests/scripts/options/general | 35 - src/gmake/tests/scripts/targets/DEFAULT | 53 - src/gmake/tests/scripts/targets/FORCE | 52 - src/gmake/tests/scripts/targets/INTERMEDIATE | 108 - src/gmake/tests/scripts/targets/PHONY | 62 - src/gmake/tests/scripts/targets/SECONDARY | 112 - src/gmake/tests/scripts/targets/SILENT | 51 - src/gmake/tests/scripts/targets/clean | 51 - src/gmake/tests/scripts/test_template | 70 - src/gmake/tests/scripts/variables/CURDIR | 20 - src/gmake/tests/scripts/variables/MAKE | 33 - src/gmake/tests/scripts/variables/MAKECMDGOALS | 52 - src/gmake/tests/scripts/variables/MAKEFILES | 34 - src/gmake/tests/scripts/variables/MAKEFILE_LIST | 30 - src/gmake/tests/scripts/variables/MAKELEVEL | 34 - src/gmake/tests/scripts/variables/automatic | 81 - src/gmake/tests/scripts/variables/flavors | 85 - src/gmake/tests/scripts/variables/special | 68 - src/gmake/tests/test_driver.pl | 1113 --- src/gmake/variable.c | 1421 --- src/gmake/variable.h | 199 - src/gmake/version.c | 17 - src/gmake/vmsdir.h | 61 - src/gmake/vmsfunctions.c | 252 - src/gmake/vmsify.c | 979 -- src/gmake/vpath.c | 586 -- src/gmake/w32/compat/dirent.c | 188 - src/gmake/w32/include/dirent.h | 62 - src/gmake/w32/include/pathstuff.h | 9 - src/gmake/w32/include/sub_proc.h | 47 - src/gmake/w32/include/w32err.h | 10 - src/gmake/w32/pathstuff.c | 238 - src/gmake/w32/subproc/NMakefile | 60 - src/gmake/w32/subproc/build.bat | 10 - src/gmake/w32/subproc/misc.c | 65 - src/gmake/w32/subproc/proc.h | 13 - src/gmake/w32/subproc/sub_proc.c | 1207 --- src/gmake/w32/subproc/w32err.c | 51 - 204 files changed, 71668 deletions(-) delete mode 100644 src/gmake/.cvsignore delete mode 100644 src/gmake/.purify delete mode 100644 src/gmake/AUTHORS delete mode 100644 src/gmake/ChangeLog delete mode 100644 src/gmake/ChangeLog.1 delete mode 100644 src/gmake/ChangeLog.2 delete mode 100644 src/gmake/INSTALL delete mode 100644 src/gmake/Makefile.DOS.template delete mode 100644 src/gmake/Makefile.am delete mode 100644 src/gmake/Makefile.ami delete mode 100644 src/gmake/NEWS delete mode 100644 src/gmake/NMakefile.template delete mode 100644 src/gmake/README.Amiga delete mode 100644 src/gmake/README.DOS.template delete mode 100644 src/gmake/README.OS2.template delete mode 100644 src/gmake/README.W32.template delete mode 100644 src/gmake/README.customs delete mode 100644 src/gmake/README.cvs delete mode 100644 src/gmake/README.template delete mode 100644 src/gmake/SCOPTIONS delete mode 100644 src/gmake/SMakefile.template delete mode 100644 src/gmake/TODO.private delete mode 100644 src/gmake/acinclude.m4 delete mode 100644 src/gmake/alloca.c delete mode 100644 src/gmake/amiga.c delete mode 100644 src/gmake/amiga.h delete mode 100644 src/gmake/ar.c delete mode 100644 src/gmake/arscan.c delete mode 100644 src/gmake/build.template delete mode 100644 src/gmake/build_w32.bat delete mode 100644 src/gmake/commands.c delete mode 100644 src/gmake/commands.h delete mode 100644 src/gmake/config.ami.template delete mode 100644 src/gmake/config.h-vms.template delete mode 100644 src/gmake/config.h.W32.template delete mode 100644 src/gmake/config/.cvsignore delete mode 100644 src/gmake/config/ChangeLog delete mode 100644 src/gmake/config/Makefile.am delete mode 100644 src/gmake/configh.dos.template delete mode 100644 src/gmake/configure.bat delete mode 100644 src/gmake/configure.in delete mode 100644 src/gmake/debug.h delete mode 100644 src/gmake/default.c delete mode 100644 src/gmake/dep.h delete mode 100644 src/gmake/dir.c delete mode 100644 src/gmake/doc/.cvsignore delete mode 100644 src/gmake/doc/Makefile.am delete mode 100644 src/gmake/doc/make.texi delete mode 100644 src/gmake/dosbuild.bat delete mode 100644 src/gmake/expand.c delete mode 100644 src/gmake/file.c delete mode 100644 src/gmake/filedef.h delete mode 100644 src/gmake/function.c delete mode 100644 src/gmake/getloadavg.c delete mode 100644 src/gmake/getopt.c delete mode 100644 src/gmake/getopt.h delete mode 100644 src/gmake/getopt1.c delete mode 100644 src/gmake/gettext.h delete mode 100644 src/gmake/glob/.cvsignore delete mode 100644 src/gmake/glob/COPYING.LIB delete mode 100644 src/gmake/glob/ChangeLog delete mode 100644 src/gmake/glob/Makefile.am delete mode 100644 src/gmake/glob/Makefile.ami delete mode 100644 src/gmake/glob/SCOPTIONS delete mode 100644 src/gmake/glob/SMakefile delete mode 100644 src/gmake/glob/configure.bat delete mode 100644 src/gmake/glob/fnmatch.c delete mode 100644 src/gmake/glob/fnmatch.h delete mode 100644 src/gmake/glob/glob.c delete mode 100644 src/gmake/glob/glob.h delete mode 100644 src/gmake/hash.c delete mode 100644 src/gmake/hash.h delete mode 100644 src/gmake/implicit.c delete mode 100644 src/gmake/job.c delete mode 100644 src/gmake/job.h delete mode 100644 src/gmake/main.c delete mode 100644 src/gmake/maintMakefile delete mode 100644 src/gmake/make.1 delete mode 100644 src/gmake/make.h delete mode 100644 src/gmake/make.lnk delete mode 100644 src/gmake/makefile.com delete mode 100644 src/gmake/makefile.vms delete mode 100644 src/gmake/misc.c delete mode 100644 src/gmake/po/.cvsignore delete mode 100644 src/gmake/po/ChangeLog delete mode 100644 src/gmake/po/LINGUAS delete mode 100644 src/gmake/po/Makevars delete mode 100644 src/gmake/po/POTFILES.in delete mode 100644 src/gmake/read.c delete mode 100644 src/gmake/readme.vms delete mode 100644 src/gmake/remake.c delete mode 100644 src/gmake/remote-cstms.c delete mode 100644 src/gmake/remote-stub.c delete mode 100644 src/gmake/rule.c delete mode 100644 src/gmake/rule.h delete mode 100644 src/gmake/signame.c delete mode 100644 src/gmake/subproc.bat delete mode 100644 src/gmake/tests/.cvsignore delete mode 100644 src/gmake/tests/COPYING delete mode 100644 src/gmake/tests/ChangeLog delete mode 100644 src/gmake/tests/NEWS delete mode 100644 src/gmake/tests/README delete mode 100644 src/gmake/tests/mkshadow delete mode 100644 src/gmake/tests/run_make_tests delete mode 100644 src/gmake/tests/run_make_tests.pl delete mode 100644 src/gmake/tests/scripts/features/comments delete mode 100644 src/gmake/tests/scripts/features/conditionals delete mode 100644 src/gmake/tests/scripts/features/default_names delete mode 100644 src/gmake/tests/scripts/features/double_colon delete mode 100644 src/gmake/tests/scripts/features/echoing delete mode 100644 src/gmake/tests/scripts/features/errors delete mode 100644 src/gmake/tests/scripts/features/escape delete mode 100644 src/gmake/tests/scripts/features/export delete mode 100644 src/gmake/tests/scripts/features/include delete mode 100644 src/gmake/tests/scripts/features/mult_rules delete mode 100644 src/gmake/tests/scripts/features/mult_targets delete mode 100644 src/gmake/tests/scripts/features/order_only delete mode 100644 src/gmake/tests/scripts/features/override delete mode 100644 src/gmake/tests/scripts/features/parallelism delete mode 100644 src/gmake/tests/scripts/features/patspecific_vars delete mode 100644 src/gmake/tests/scripts/features/quoting delete mode 100644 src/gmake/tests/scripts/features/recursion delete mode 100644 src/gmake/tests/scripts/features/reinvoke delete mode 100644 src/gmake/tests/scripts/features/statipattrules delete mode 100644 src/gmake/tests/scripts/features/targetvars delete mode 100644 src/gmake/tests/scripts/features/varnesting delete mode 100644 src/gmake/tests/scripts/features/vpath delete mode 100644 src/gmake/tests/scripts/features/vpath2 delete mode 100644 src/gmake/tests/scripts/features/vpathgpath delete mode 100644 src/gmake/tests/scripts/features/vpathplus delete mode 100644 src/gmake/tests/scripts/functions/addprefix delete mode 100644 src/gmake/tests/scripts/functions/addsuffix delete mode 100644 src/gmake/tests/scripts/functions/basename delete mode 100644 src/gmake/tests/scripts/functions/call delete mode 100644 src/gmake/tests/scripts/functions/dir delete mode 100644 src/gmake/tests/scripts/functions/error delete mode 100644 src/gmake/tests/scripts/functions/eval delete mode 100644 src/gmake/tests/scripts/functions/filter-out delete mode 100644 src/gmake/tests/scripts/functions/findstring delete mode 100644 src/gmake/tests/scripts/functions/foreach delete mode 100644 src/gmake/tests/scripts/functions/if delete mode 100644 src/gmake/tests/scripts/functions/join delete mode 100644 src/gmake/tests/scripts/functions/notdir delete mode 100644 src/gmake/tests/scripts/functions/origin delete mode 100644 src/gmake/tests/scripts/functions/sort delete mode 100644 src/gmake/tests/scripts/functions/strip delete mode 100644 src/gmake/tests/scripts/functions/substitution delete mode 100644 src/gmake/tests/scripts/functions/suffix delete mode 100644 src/gmake/tests/scripts/functions/value delete mode 100644 src/gmake/tests/scripts/functions/warning delete mode 100644 src/gmake/tests/scripts/functions/wildcard delete mode 100644 src/gmake/tests/scripts/functions/word delete mode 100644 src/gmake/tests/scripts/misc/general1 delete mode 100644 src/gmake/tests/scripts/misc/general2 delete mode 100644 src/gmake/tests/scripts/misc/general3 delete mode 100644 src/gmake/tests/scripts/misc/general4 delete mode 100644 src/gmake/tests/scripts/options/dash-B delete mode 100644 src/gmake/tests/scripts/options/dash-C delete mode 100644 src/gmake/tests/scripts/options/dash-I delete mode 100644 src/gmake/tests/scripts/options/dash-e delete mode 100644 src/gmake/tests/scripts/options/dash-f delete mode 100644 src/gmake/tests/scripts/options/dash-k delete mode 100644 src/gmake/tests/scripts/options/dash-l delete mode 100644 src/gmake/tests/scripts/options/dash-n delete mode 100644 src/gmake/tests/scripts/options/dash-q delete mode 100644 src/gmake/tests/scripts/options/dash-t delete mode 100644 src/gmake/tests/scripts/options/general delete mode 100644 src/gmake/tests/scripts/targets/DEFAULT delete mode 100644 src/gmake/tests/scripts/targets/FORCE delete mode 100644 src/gmake/tests/scripts/targets/INTERMEDIATE delete mode 100644 src/gmake/tests/scripts/targets/PHONY delete mode 100644 src/gmake/tests/scripts/targets/SECONDARY delete mode 100644 src/gmake/tests/scripts/targets/SILENT delete mode 100644 src/gmake/tests/scripts/targets/clean delete mode 100644 src/gmake/tests/scripts/test_template delete mode 100644 src/gmake/tests/scripts/variables/CURDIR delete mode 100644 src/gmake/tests/scripts/variables/MAKE delete mode 100644 src/gmake/tests/scripts/variables/MAKECMDGOALS delete mode 100644 src/gmake/tests/scripts/variables/MAKEFILES delete mode 100644 src/gmake/tests/scripts/variables/MAKEFILE_LIST delete mode 100644 src/gmake/tests/scripts/variables/MAKELEVEL delete mode 100644 src/gmake/tests/scripts/variables/automatic delete mode 100644 src/gmake/tests/scripts/variables/flavors delete mode 100644 src/gmake/tests/scripts/variables/special delete mode 100644 src/gmake/tests/test_driver.pl delete mode 100644 src/gmake/variable.c delete mode 100644 src/gmake/variable.h delete mode 100644 src/gmake/version.c delete mode 100644 src/gmake/vmsdir.h delete mode 100644 src/gmake/vmsfunctions.c delete mode 100644 src/gmake/vmsify.c delete mode 100644 src/gmake/vpath.c delete mode 100644 src/gmake/w32/compat/dirent.c delete mode 100644 src/gmake/w32/include/dirent.h delete mode 100644 src/gmake/w32/include/pathstuff.h delete mode 100644 src/gmake/w32/include/sub_proc.h delete mode 100644 src/gmake/w32/include/w32err.h delete mode 100644 src/gmake/w32/pathstuff.c delete mode 100644 src/gmake/w32/subproc/NMakefile delete mode 100644 src/gmake/w32/subproc/build.bat delete mode 100644 src/gmake/w32/subproc/misc.c delete mode 100644 src/gmake/w32/subproc/proc.h delete mode 100644 src/gmake/w32/subproc/sub_proc.c delete mode 100644 src/gmake/w32/subproc/w32err.c diff --git a/src/gmake/.cvsignore b/src/gmake/.cvsignore deleted file mode 100644 index 7fc3895f..00000000 --- a/src/gmake/.cvsignore +++ /dev/null @@ -1,32 +0,0 @@ -*.gz *.Z *.tar *.tgz -=* -TODO COPYING* ABOUT-NLS -make-3* make-test* -*.info *.info-* -stamp-* -makebook* - -.*gdbinit - -*.dep *.dvi *.toc *.aux *.log -*.cp *.cps *.fn *.fns *.vr *.vrs *.tp *.tps *.ky *.kys *.pg *.pgs - -README README.DOS README.W32 -aclocal.m4 autom4te.cache -config.h.in config.h config.status config.cache configure -Makefile.in Makefile -build.sh.in build.sh -SMakefile NMakefile Makefile.DOS -config.ami configh.dos config.h.W32 config.h-vms - -loadavg loadavg.c make - -.deps .dep_segment - -_* -sun4 i386 i386-netbsd hp300-netbsd hp300 rs6000 sun3 news800 amiga -hp700 hp834 mips sol2 i486-linux - -customs - -install-sh mkinstalldirs diff --git a/src/gmake/.purify b/src/gmake/.purify deleted file mode 100644 index dc1b1d9c..00000000 --- a/src/gmake/.purify +++ /dev/null @@ -1,12 +0,0 @@ -# Solaris (2.5.1) has a couple if issues. -# -suppress plk malloc; setvbuf "libc*"; main "main.c" -suppress umr kstat_read; kstat_chain_update; kstat_open; getloadavg -suppress umr kstat_chain_update; kstat_open; getloadavg - -# The command line options stuff leaks a little bit. No big deal. -# -suppress mlk malloc; xmalloc "misc.c"; decode_env_switches "main.c" -suppress plk malloc; xmalloc "misc.c"; decode_env_switches "main.c" -suppress mlk malloc; xmalloc "misc.c"; concat "misc.c"; decode_env_switches "main.c" -suppress plk malloc; xmalloc "misc.c"; concat "misc.c"; decode_env_switches "main.c" diff --git a/src/gmake/AUTHORS b/src/gmake/AUTHORS deleted file mode 100644 index 88d61c30..00000000 --- a/src/gmake/AUTHORS +++ /dev/null @@ -1,57 +0,0 @@ ------------------------------------ - -GNU make development up to version 3.75 by: - Roland McGrath - - -Development starting with GNU make 3.76 by: - Paul D. Smith - - -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 - Archive support/Bug fixes by: - John W. Eaton - Martin Zinser - - Port to Amiga by: - Aaron Digulla - - - Port to MS-DOS (DJGPP) and MS-Windows 95/NT by: - DJ Delorie - Rob Tulloh - Eli Zaretskii - ------------------------------------ -Other contributors: - - Janet Carson - Howard Chu - Paul Eggert - Klaus Heinz - Michael Joosten - Jim Kelton - David Lubbren - Tim Magill - Greg McGary - Han-Wen Nienhuys - Andreas Schwab - Carl Staelin (Princeton University) - Ian Stewartson (Data Logic Limited) - -With suggestions/comments/bug reports from a cast of ... well ... -hundreds, anyway :) diff --git a/src/gmake/ChangeLog b/src/gmake/ChangeLog deleted file mode 100644 index 4a28b1c9..00000000 --- a/src/gmake/ChangeLog +++ /dev/null @@ -1,1195 +0,0 @@ -2003-11-02 Paul D. Smith - - * function.c (func_if): Strip all the trailing whitespace from the - condition, then don't expand it. Fixed bug # 5798. - - * expand.c (recursively_expand_for_file): If we're expanding a - variable with no file context, then use the variable's context. - Fixes bug # 6195. - -2003-10-21 Paul D. Smith - - * main.c (log_working_directory): Add newlines to printf()s. - - * README.cvs: Add a note to ignore warnings during autoreconf. - - * maintMakefile (po_repo): Set a new URL for PO file updates. - (get-config/config.guess get-config/config.sub): Get these files - from the Savannah config project instead of ftp.gnu.org. - -2003-07-18 Paul D. Smith - - * dir.c (directory_contents_hash_1, directory_contents_hash_1) - [WINDOWS32]: Initialize hash. - -2003-06-19 Earnie Boyd - - * dir.c (read_dirstream): Provide a workaround for broken versions of - the MinGW dirent structure. - -2003-05-30 Earnie Boyd - - * w32/include/dirent.h: Add __MINGW32__ filter. - -2003-05-30 Earnie Boyd - - * make.h: Add global declaration of *make_host. - * main.c (print_usage): Remove local declaration of *make_host. - (print_version): Display "This program built for ..." after Copyright - notice. - -2003-05-30 Earnie Boyd - - * doc/make.texi: Change "ifinfo" to "ifnottex" as suggested by the - execution of "makeinfo --html make.texi". - -2003-04-30 Paul D. Smith - - * build.template: Make some changes to maybe allow this script to - work on DOS/Windows/OS2 systems. Suggested by Andreas Buening. - - * README.OS2.template: New file for OS/2 support. Original - contributed by Andreas Buening. - * configure.in: Invoke new pds_AC_DOS_PATHS macro to test for - DOS-style paths. - -2003-04-19 Paul D. Smith - - Fix bug #1405: allow a target to match multiple pattern-specific - variables. - - * rule.c (create_pattern_var, lookup_pattern_var): Move these to - variable.c, where they've always belonged. - * rule.h: Move the prototypes and struct pattern_var as well. - * variable.c (initialize_file_variables): Invoke - lookup_pattern_var() in a loop, until no more matches are found. - If a match is found, create a new variable set for the target's - pattern variables. Then merge the contents of each matching - pattern variable set into the target's pattern variable set. - (lookup_pattern_var): Change this function to be usable - in a loop. It takes a starting position: if NULL, start at the - beginning; if non-NULL, start with the pattern variable after that - position, and return the next matching pattern. - (create_pattern_var): Create a unique instance of - pattern-specific variables for every definition in the makefile. - Don't combine the same pattern together. This allows us to - process the variable handling properly even when the same pattern - is used multiple times. - (parse_variable_definition): New function: break out the parsing - of a variable definition line from try_variable_definition. - (try_variable_definition): Call parse_variable_definition to - parse. - (print_variable_data_base): Print out pattern-specific variables. - * variable.h (struct variable): Remember when a variable is - conditional. Also remember its flavor. - (struct pattern_var): Instead of keeping a variable set, we just - keep a single variable for each pattern. - * read.c (record_target_var): Each pattern variable contains only a - single variable, not a set, so create it properly. - * doc/make.texi (Pattern-specific): Document the new behavior. - -2003-04-17 Paul D. Smith - - * dir.c (file_exists_p) [VMS]: Patch provided with Bug #3018 by - Jean-Pierre Portier . I don't understand the - file/directory naming rules for VMS so I can't tell whether this - is correct or not. - -2003-04-09 Paul D. Smith - - * configure.in (HAVE_DOS_PATHS): Define this on systems that need - DOS-style pathnames: backslash separators and drive specifiers. - -2003-03-28 Paul D. Smith - - * file.c (snap_deps): If .SECONDARY with no targets is given, set - the intermediate flag on all targets. Fixes bug #2515. - -2003-03-24 Paul D. Smith - - * configure.in, Makefile.am, glob/Makefile.am, doc/Makefile.am: - Upgrade to autoconf 2.57 and automake 1.7.3. - - * job.c: More OS/2 changes from Andreas Buening. - - * file.c (print_file): Fix variable initialization. - Fixes bug #2892. - - * remake.c (notice_finished_file): - - * make.h (ENULLLOOP): Set errno = 0 before invoking the command; - some calls (like readdir()) return NULL in valid situations - without resetting errno. Fixes bug #2846. - -2003-02-25 Paul D. Smith - - Port to OS/2 (__EMX__) by Andreas Buening . - - * job.c (_is_unixy_shell) [OS/2]: New function. - Set default shell to /bin/sh. - (reap_children): Close the job_rfd pipe here since we don't use a - SIGCHLD handler. - (set_child_handler_action_flags): define this to empty on OS/2. - (start_job_command): Close the jobserver pipe and use - child_execute_job() instead of fork/exec. - (child_execute_job): Rewrite to handle stdin/stdout FDs and spawn - rather than exec'ing, then reconfigure stdin/stdout. - (exec_command): Rewrite to use spawn instead of exec. Return the - PID of the child. - - * main.c (main) [OS/2]: Call initialize_main(). Handle argv[0] as - in DOS. Handle the TEMP environment variable as in DOS. Don't - use a SIGCHLD handler on OS/2. Choose a shell as in DOS. Don't - use -j in DOS mode. Use child_execute_job() instead of - exec_command(). - - * function.c (func_shell) [OS/2]: Can't use fork/exec on OS/2: use - spawn() instead. - - * job.h [OS/2]: Move CLOSE_ON_EXEC here from job.c. Add - prototypes that return values. - - * remake.c (f_mtime) [OS/2]: Handle FAT timestamp offsets for OS/2. - - * read.c (readline) [OS/2]: Don't handle CRLF specially on OS/2. - * default.c (default_suffixes) [OS/2]: Set proper default suffixes - for OS/2. - * vpath.c (construct_vpath_list) [OS/2]: Handle OS/2 paths like - DOS paths. - -2003-02-24 Paul D. Smith - - * default.c [VMS]: New default rules for .cxx -> .obj compiles. - * job.c (child_execute_job) [VMS]: New code for handling spawn(). - (child_execute_job) [VMS]: Handle error status properly. - Patches provided by Hartmut Becker . - - * function.c (func_shell): Use EINTRLOOP() while reading from the - subshell pipe (Fixes bug #2502). - * job.c (free_child): Use EINTRLOOP() while writing tokens to the - jobserver pipe. - * main.c (main): Ditto. - -2003-01-30 Paul D. Smith - - * read.c (eval): eval() was not fully reentrant, because the - collapsed buffer was static. Change it to be an automatic - variable so that eval() can be invoked recursively. - Fixes bug # 2238. - (eval): Apply patch # 1022: fix memory reference error on long - target-specific variable lines. - Patch provided by Steve Brown . - - * function.c (check_numeric): Combine the is_numeric() function - into this function, since it's only called from one place. - Constify this function. Have it print the incorrect string in the - error message. Fixes bug #2407. - (strip_whitespace): Constify. - (func_if): Constify. - * expand.c (expand_argument): Constify. - -2003-01-29 Paul D. Smith - - Fix bug # 2169, also reported by other people on various systems. - - * make.h: Some systems, such as Solaris and PTX, do not fully - implement POSIX-compliant SA_RESTART functionality; important - system calls like stat() and readdir() can still fail with EINTR - even if SA_RESTART has been set on the signal handler. So, - introduce macros EINTRLOOP() and ENULLLOOP() which can loop on - EINTR for system calls which return -1 or 0 (NULL), respectively, - on error. - Also, remove the old atomic_stat()/atomic_readdir() and - HAVE_BROKEN_RESTART handling. - - * configure.in: Remove setting of HAVE_BROKEN_RESTART. - - * arscan.c (ar_member_touch): Use EINTRLOOP() to wrap fstat(). - * remake.c (touch_file): Ditto. - - * commands.c (delete_target): Use EINTRLOOP() to wrap stat(). - * read.c (construct_include_path): Ditto. - * remake.c (name_mtime): Ditto. - * vpath.c (selective_vpath_search): Ditto. - * dir.c (find_directory): Ditto. - (local_stat): Ditto. - (find_directory): Use ENULLLOOP() to wrap opendir(). - (dir_contents_file_exists_p): Use ENULLLOOP() to wrap readdir(). - - * misc.c: Remove HAVE_BROKEN_RESTART, atomic_stat(), and - atomic_readdir() handling. - -2003-01-22 Paul D. Smith - - * function.c (func_call): Fix Bug #1744. If we're inside a - recursive invocation of $(call ...), mask any of the outer - invocation's arguments that aren't used by this one, so that this - invocation doesn't "inherit" them accidentally. - -2002-12-05 Paul D. Smith - - * function.c (subst_expand): Valery Khamenia reported a - pathological performance hit when doing substitutions on very - large values with lots of words: turns out we were invoking - strlen() a ridiculous number of times. Instead of having each - call to sindex() call strlen() again, keep track of how much of - the text we've seen and pass the length to sindex(). - -2002-11-19 Paul D. Smith - - * README.cvs, configure.in: Upgrade to require autoconf 2.56. - - -2002-11-16 Paul D. Smith - - * NMakefile.template (OBJS): Add hash.c object file. - * SMakefile.template (srcs): Ditto. - * Makefile.ami (objs): Ditto. - * build_w32.bat: Ditto. - - * Makefile.DOS.template: Remove extra dependencies. - -2002-10-25 Paul D. Smith - - * expand.c (install_variable_buffer): New function. Install a new - variable_buffer context and return the previous one. - (restore_variable_buffer): New function. Free the current - variable_buffer context and put a previously saved one back. - * variable.h: Prototypes for {install,restore}_variable_buffer. - * function.c (func_eval): Push a new variable_buffer context - before we eval, then restore the old one when we're done. - Fixes Bug #1517. - - * read.c (install_conditionals): New function. Install a new - conditional context and return the previous one. - (restore_conditionals): New function. Free the current - conditional context and put a previously saved one back. - (eval): Use the {install,restore}_conditionals for "include" - handling. - (eval_buffer): Use {install,restore}_conditionals to preserve the - present conditional state before we evaluate the buffer. - Fixes Bug #1516. - - * doc/make.texi (Quick Reference): Add references to $(eval ...) - and $(value ...). - (Recursion): Add a variable index entry for CURDIR. - - * README.cvs: Update to appropriate versions. - * Makefile.am (nodist_loadavg_SOURCES): automake gurus point out I - don't need to copy loadavg.c: automake is smart enough to create - it for me. Still have a bug in automake related to ansi2knr tho. - -2002-10-14 Paul D. Smith - - * remake.c (notice_finished_file): Only touch targets if they have - at least one command (as per POSIX). Resolve Bug #1418. - - * *.c: Convert to using ANSI C-style function definitions. - * Makefile.am: Enable the ansi2knr feature of automake. - * configure.in: ditto. - -2002-10-13 Paul D. Smith - - * commands.c (set_file_variables): Bug #1379: Don't use alloca() - for automatic variable values like $^, etc. In the case of very - large lists of prerequisites this causes problems. Instead reuse - a static buffer (resizeable) for each variable. - - * read.c (eval): Fix Bug #1391: allow "export" keyword in - target-specific variable definitions. Check for it and set an - "exported" flag. - (record_target_var): Set the export field to v_export if the - "exported" flag is set. - * doc/make.texi (Target-specific): Document the ability to use - "export". - - * doc/make.texi: Change the name of the section on automatic - variables from "Automatic" to "Automatic Variables". Added text - clarifying the scope of automatic variables. - -2002-10-04 Paul D. Smith - - * read.c (eval): Allow SysV $$@ variables to use {} braces as well - as () braces. - (record_files): Ditto. - - * expand.c (variable_expand_string): In $(A:x=y) expansion limit - the search for the '=' to only within the enclosing parens. - -2002-10-03 Paul D. Smith - - Version 3.80 released. - - * dir.c: Change hash functions to use K&R function definition style. - * function.c: Ditto. - * read.c: Ditto. - * variable.c: Ditto. - - Update to automake 1.7. - - * Makefile.am (AUTOMAKE_OPTIONS): Update to require 1.7. - (pdf): Remove this target as automake now provides one. - - * configure.in: Change AM_CONFIG_HEADER to AC_CONFIG_HEADERS. - -2002-09-30 Martin P.J. Zinser - - * makefile.com: Updates for GNU make 3.80. - * makefile.vms: Ditto. - -2002-09-23 Paul D. Smith - - * read.c (enum make_word_type): Remove w_comment. - (get_next_mword): Don't treat comment characters as special; where - this function is used we will never see a comment (it's stripped - before we get here) and treating comments specially means that - targets like "foo\#bar" aren't handled properly. - -2002-09-18 Paul D. Smith - - * doc/make.texi (Bugs): Update with some info on Savannah, etc. - - * read.c (eval): Expansion of arguments to export/unexport was - ignoring all arguments after the first one. Change the algorithm - to expand the whole line once, then parse the results. - -2002-09-17 Paul D. Smith - - Fix Bug #940 (plus another bug I found while looking at this): - - * read.c (record_target_var): enter_file() will add a new entry if - it's a double-colon target: we don't want to do that in this - situation. Invoke lookup_file() and only enter_file() if it does - not already exist. If the file we get back is a double-colon then - add this variable to the "root" double-colon target. - - * variable.c (initialize_file_variables): If this file is a - double-colon target but is not the "root" target, then initialize - the root and make the root's variable list the parent of our - variable list. - -2002-09-13 Paul D. Smith - - * doc/make.texi (MAKE Variable): Add some indexing for "+". - - * hash.c (round_up_2): Get rid of a warning. - -2002-09-12 Paul D. Smith - - * Makefile.am (loadavg_SOURCES, loadavg.c): Tiptoe around automake - so it doesn't complain about getloadavg.c. - - * commands.c (set_file_variables): Make sure we always alloca() at - least 1 character for the value of $? (for '\0'). - -2002-09-11 Paul D. Smith - - * hash.h (STRING_COMPARE, ISTRING_COMPARE, STRING_N_COMPARE): Fix - macro to use RESULT instead of the incorrect _RESULT_. - - * make.h (HAVE_BROKEN_RESTART): Add prototypes for atomic_stat() - and atomic_readdir(). We need to #include dirent.h to get this to - work. - * misc.c (atomic_readdir): Fix typos. - -2002-09-10 Paul D. Smith - - * read.c (eval): Expand variable lists given to export and - unexport, so that "export $(LIST_OF_VARIABLES)" (etc.) works. - (conditional_line): Ditto for "ifdef". Fixes bug #103. - - * doc/make.texi (Variables/Recursion): Document this. - (Conditional Syntax): And here. - -2002-09-09 Paul D. Smith - - * configure.in: Check for memmove(). - -2002-09-07 Paul D. Smith - - * configure.in (HAVE_BROKEN_RESTART): Define this on PTX systems; - Michael Sterrett reports that while it has - SA_RESTART, it does not work properly. - - * misc.c (atomic_stat): If HAVE_BROKEN_RESTART, create a function - that invokes stat() and loops to do it again if it returns EINTR. - (atomic_readdir): Ditto, with readdir(). - - * make.h (stat, readdir): If HAVE_BROKEN_RESTART, alias stat() - and readdir() to atomic_stat() and atomic_readdir(). - -2002-09-04 Paul D. Smith - - * implicit.c (pattern_search): Daniel - reports that GNU make sometimes doesn't recognize that targets can - be made, when directories can be created as prerequisites. He - reports that changing the order of predicates in the DEP->changed - flag test so that lookup_file() is always performed, solves this - problem. - -2002-08-08 Paul D. Smith - - * configure.in: Require a newer version of gettext. - - * misc.c (perror_with_name): Translate the format string (for - right-to-left language support). - (pfatal_with_name): Ditto. - - * main.c: Create a static array of strings to store the usage - text. This is done to facilitate translations. - (struct command_switch): Remove argdesc and description fields. - (switches): Remove values for obsolete fields. - (print_usage): Print each element of the usage array. - - * hash.c: Change function definitions to be K&R style. - -2002-08-02 Paul D. Smith - - * NEWS: Remove the mention of .TARGETS; we aren't going to publish - this one because it's too hard to get right. We'll look at it for - a future release. - * main.c (main): Don't create the .TARGETS variable. - * variable.c (handle_special_var): Don't handle .TARGETS. - -2002-08-01 Paul D. Smith - - * main.c (switches): Add a new option, -B (--always-make). If - specified, make will rebuild all targets that it encounters even - if they don't appear to be out of date. - (always_make_flag): New flag. - * make.h: Extern always_make_flag. - * remake.c (update_file_1): Check always_make_flag; if it's set we - will always rebuild any target we can, even if none of its - prerequisites are newer. - * NEWS: Mention it. - - * doc/make.texi (Shell Function): Make it clear that make - variables marked as "export" are not passed to instances of the - shell function. - - Add new introspection variable .VARIABLES and .TARGETS. - - * variable.c (handle_special_var): New function. If the variable - reference passed in is "special" (.VARIABLES or .TARGETS), - calculate the new value if necessary. .VARIABLES is handled here: - walk through the hash of defined variables and construct a value - which is a list of the names. .TARGETS is handled by - build_target_list(). - (lookup_variable): Invoke handle_special_var(). - * file.c (build_target_list): Walk through the hask of known files - and construct a list of the names of all the ones marked as - targets. - * main.c (main): Initialize them to empty (and as simple variables). - * doc/make.texi (Special Variables): Document them. - * NEWS: Mention them. - - * variable.h (struct variable): Add a new flag "exportable" which - is true if the variable name is valid for export. - * variable.c (define_variable_in_set): Set "exportable" when a new - variable is defined. - (target_environment): Use the "exportable" flag instead of - re-checking the name here... an efficiency improvement. - -2002-07-31 Paul D. Smith - - * config.h-vms.template: Updates to build on VMS. Thanks to - Brian_Benning@aksteel.com for helping verify the build. - * makefile.com: Build the new hash.c file. - * hash.h: Use strcpmi(), not stricmp(), in the - HAVE_CASE_INSENSITIVE_FS case. - -2002-07-30 Paul D. Smith - - * hash.h (ISTRING_COMPARE, return_ISTRING_COMPARE): Add missing - backslashes to the HAVE_CASE_INSENSITIVE_FS case. - Reported by . - -2002-07-10 Paul D. Smith - - * variable.c (pop_variable_scope): Remove variable made unused by - new hash infrastructure. - * read.c (dep_hash_cmp): Rewrite this to handle ignore_mtime - comparisons as well as name comparisons. - * variable.h: Add a prototype for new hash_init_function_table(). - * file.c (lookup_file): Remove variables made unused by new hash - infrastructure. - * dir.c (directory_contents_hash_2): Missing return of hash value. - (dir_contents_file_exists_p): Remove variables made unused by new - hash infrastructure. - - - Installed Greg McGary's integration of the hash functions from the - GNU id-utils package: - -2002-07-10 Greg McGary - - * scripts/functions/filter-out: Add literals to to the - pattern space in order to add complexity, and trigger - use of an internal hash table. Fix documentation strings. - * scripts/targets/INTERMEDIATE: Reverse order of files - passed to expected `rm' command. - -2002-07-10 Greg McGary - - * Makefile.am (SRCS): Add hash.c (noinst_HEADERS): Add hash.h - * hash.c: New file, taken from id-utils. - * hash.h: New file, taken from id-utils. - - * make.h (HASH, HASHI): Remove macros. - (find_char_unquote): Change arglist in decl. - (hash_init_directories): New function decl. - * variable.h (hash.h): New #include. - (MAKELEVEL_NAME, MAKELEVEL_LENGTH): New constants. - * filedef.h (hash.h): New #include. - (struct file) [next]: Remove member. - (file_hash_enter): Remove function decl. - (init_hash_files): New function decl. - - * ar.c (ar_name): Delay call to strlen until needed. - * main.c (initialize_global_hash_tables): New function. - (main): Call it. Use MAKELEVEL_NAME & MAKELEVEL_LENGTH. - * misc.c (remove_comments): Pass char constants to find_char_unquote. - * remake.c (notice_finished_file): Update last_mtime on `prev' chain. - - * dir.c (hash.h): New #include. - (struct directory_contents) [next, files]: Remove members. - [ctime]: Add member for VMS. [dirfiles]: Add hash-table member. - (directory_contents_hash_1, directory_contents_hash_2, - directory_contents_hash_cmp): New functions. - (directories_contents): Change type to `struct hash_table'. - (struct directory) [next]: Remove member. - (directory_hash_1, directory_hash_2, directory_hash_cmp): New funcs. - (directory): Change type to `struct hash_table'. - (struct dirfile) [next]: Remove member. - [length]: Add member. [impossible]: widen type to fill alignment gap. - (dirfile_hash_1, dirfile_hash_2, dirfile_hash_cmp): New functions. - (find_directory): Use new hash table package. - (dir_contents_file_exists_p): Likewise. - (file_impossible): Likewise. - (file_impossible_p): Likewise. - (print_dir_data_base): Likewise. - (open_dirstream): Likewise. - (read_dirstream): Likewise. - (hash_init_directories): New function. - - * file.c (hash.h): New #include. - (file_hash_1, file_hash_2, file_hash_cmp): New functions. - (files): Change type to `struct hash_table'. - (lookup_file): Use new hash table package. - (enter_file): Likewise. - (remove_intermediates): Likewise. - (snap_deps): Likewise. - (print_file_data_base): Likewise. - - * function.c - (function_table_entry_hash_1, function_table_entry_hash_2, - function_table_entry_hash_cmp): New functions. - (lookup_function): Remove `table' argument. - Use new hash table package. - (struct a_word) [chain, length]: New members. - (a_word_hash_1, a_word_hash_2, a_word_hash_cmp): New functions. - (struct a_pattern): New struct. - (func_filter_filterout): Pass through patterns noting boundaries - and '%', if present. Note a_word length. Use a hash table if - arglists are large enough to justify cost. - (function_table_init): Renamed from function_table. - (function_table): Declare as `struct hash_table'. - (FUNCTION_TABLE_ENTRIES): New constant. - (hash_init_function_table): New function. - - * read.c (hash.h): New #include. - (read_makefile): Pass char constants to find_char_unquote. - (dep_hash_1, dep_hash_2, dep_hash_cmp): New functions. - (uniquize_deps): Use hash table to efficiently identify duplicates. - (find_char_unquote): Accept two char-constant stop chars, rather - than a string constant, avoiding zillions of calls to strchr. - Tighten inner search loops to test only for desired delimiters. - - * variable.c (variable_hash_1, variable_hash_2, - variable_hash_cmp): New functions. - (variable_table): Declare as `struct hash_table'. - (global_variable_set): Remove initialization. - (init_hash_global_variable_set): New function. - (define_variable_in_set): Use new hash table package. - (lookup_variable): Likewise. - (lookup_variable_in_set): Likewise. - (initialize_file_variables): Likewise. - (pop_variable_scope): Likewise. - (create_new_variable_set): Likewise. - (merge_variable_sets): Likewise. - (define_automatic_variables): Likewise. - (target_environment): Likewise. - (print_variable_set): Likewise. - -2002-07-10 Paul D. Smith - - Implement the SysV make syntax $$@, $$(@D), and $$(@F) in the - prerequisite list. A real SysV make will expand the entire - prerequisites list _twice_: we don't do that as it's a big - backward-compatibility problem. We only replace those specific - variables. - - * read.c (record_files): Replace any $@, $(@D), and $(@F) variable - references left in the list of prerequisites. Check for .POSIX as - we record targets, so we can disable non-POSIX behavior while - reading makefiles as well as running them. - (eval): Check the prerequisite list to see if we have anything - that looks like a SysV prerequisite variable reference. - -2002-07-09 Paul D. Smith - - * doc/make.texi (Prerequisite Types): Add a new section describing - order-only prerequisites. - - * read.c (uniquize_deps): If we have the same file as both a - normal and order-only prereq, get rid of the order-only prereq, - since the normal one supersedes it. - -2002-07-08 Paul D. Smith - - * AUTHORS: Added Greg McGary to the AUTHORS file. - * NEWS: Blurbed order-only prerequisites. - * file.c (print_file): Show order-only deps properly when printing - the database. - - * maintMakefile: Add "update" targets for wget'ing the latest - versions of various external files. Taken from Makefile.maint in - autoconf, etc. - - * dosbuild.bat: Somehow we got _double_ ^M's. Remove them. - Reported by Eli Zaretskii . - -2002-07-07 Paul D. Smith - - * po/*.po: Remove. We'll use wget to retrieve them at release - time. - - * variable.c (do_variable_definition) [W32]: On W32 using cmd - rather than a shell you get an exception. Make sure we look up - the variable. Patch provided by Eli Zaretskii . - - * remake.c (notice_finished_file): Fix handling of -t flag. - Patch provided by Henning Makholm . - - * implicit.c (pattern_search): Some systems apparently run short - of stack space, and using alloca() in this function caused an - overrun. I modified it to use xmalloc() on the two variables - which seemed like they might get large. Fixes Bug #476. - - * main.c (print_version): Update copyright notice to conform with - GNU standards. - (print_usage): Update help output. - - * function.c (func_eval): Create a new make function, $(eval - ...). Expand the arguments, put them into a buffer, then invoke - eval_buffer() on the resulting string. - (func_quote): Create a new function, $(quote VARNAME). Inserts - the value of the variable VARNAME without expanding it any - further. - - * read.c (struct ebuffer): Change the linebuffer structure to an - "eval buffer", which can be either a file or a buffer. - (eval_makefile): Move the code in the old read_makefile() which - located a makefile into here: create a struct ebuffer with that - information. Have it invoke the new function eval() with that - ebuffer. - (eval_buffer): Create a new function that creates a struct ebuffer - that holds a string buffer instead of a file. Have it invoke - eval() with that ebuffer. - (eval): New function that contains the guts of the old - read_makefile() function: this function parses makefiles. Obtains - data to parse from the provided ebuffer. Some modifications to - make the flow of the function cleaner and clearer. Still could - use some work here... - (do_define): Takes a struct ebuffer instead of a FILE*. Read the - contents of the define/endef variable from the ebuffer. - (readstring): Read the next line from a string-style ebuffer. - (readline): Read the next line from an ebuffer. If it's a string - ebuffer, invoke readstring(). If it's a FILE* ebuffer, read it - from the file. - - * dep.h (eval_buffer): Prototype eval_buffer(); - - * variable.c (do_variable_definition): Make sure that all - non-target-specific variables are registered in the global set. - If we're invoked from an $(eval ...) we might be inside a $(call - ...) or other function which has pushed a variable scope; we still - want to define our variables from evaluated makefile code in the - global scope. - -2002-07-03 Greg McGary - - * dep.h (struct dep) [ignore_mtime]: New member. - [changed]: convert to a bitfield. - * implicit.c (pattern_search): Zero ignore_mtime. - * main.c (main, handle_non_switch_argument): Likewise. - * rule.c (convert_suffix_rule): Likewise. - * read.c (read_all_makefiles, read_makefile, multi_glob): Likewise. - (read_makefile): Parse '|' in prerequisite list. - (uniquize_deps): Consider ignore_mtime when comparing deps. - * remake.c (update_file_1, check_dep): Don't force remake for - dependencies that have d->ignore_mtime. - * commands.c (FILE_LIST_SEPARATOR): New constant. - (set_file_variables): Don't include a - prerequisite in $+, $^ or $? if d->ignore_mtime. - Define $|. - -2002-06-18 Paul D. Smith - - * make.texinfo: Updates for next revision. New date/rev/etc. - Recreate all Info menus. Change license on the manual to the GNU - Free Documentation License. A number of typos. - (Variables Simplify): Don't use "-" before it's defined. - (Automatic Prerequisites): Rewrite the target example to work - properly if the compile fails. Remove incorrect comments about - how "set -e" behaves. - (Text Functions): Move the "word", "wordlist", "words", and - "firstword" functions here, from "File Name Functions". - * make-stds.texi: Update from latest GNU version. - * fdl.texi: (created) Import the latest GNU version. - -2002-06-06 Paul D. Smith - - * variable.c (do_variable_definition): New function: extract the - part of try_variable_definition() that actually sets the value - into a separate function. - (try_variable_definition): Call do_variable_definition() after - parsing the variable definition string. - (define_variable_in_set): Make the name argument const. - - * variable.h (enum variable_flavor): Make public. - (do_variable_definition): Create prototype. - - * read.c (read_all_makefiles): Create a new built-in variable, - MAKEFILE_LIST. - (read_makefile): Add each makefile read in to this variable value. - -2002-05-18 Eli Zaretskii - - * Makefile.DOS.template: Tweak according to changes in the - distribution. Add back the dependencies of *.o files. - - * configh.dos.template: Synchronize with config.h.in. - -2002-05-09 Paul D. Smith - - * file.c (file_timestamp_now): Use K&R function declaration. - - * getloadavg.c (getloadavg): Merge setlocale() fix from sh-utils - getloadavg.c. Autoconf thinks QNX is SVR4-like, but it isn't, so - #undef it. Remove predefined setup of NLIST_STRUCT. Decide - whether to include nlist.h based on HAVE_NLIST_H. Change obsolete - NLIST_NAME_UNION to new HAVE_STRUCT_NLIST_N_UN_N_NAME. - * configure.in (NLIST_STRUCT): Define this if we have nlist.h and - nlist.n_name is a pointer rather than an array. - - * acinclude.m4 (make_FUNC_SETVBUF_REVERSED): Grab the latest - version of AC_FUNC_SETVBUF_REVERSED from autoconf CVS. - * configure.in: Use it instead of the old version. - - * main.c (main): Prefer setvbuf() to setlinebuf(). - -2002-05-08 Paul D. Smith - - * Makefile.am (make_LDADD): Add GETLOADAVG_LIBS. - (loadavg_LDADD): Ditto. - -2002-04-29 Paul D. Smith - - * expand.c (recursively_expand_for_file): Rename - recursively_expand() to recursively_expand_for_file() and provide - an extra argument, struct file. If the argument is provided, set - the variable scope to that of the file before expanding. - * variable.h (recursively_expand): Make this a macro that invokes - recursively_expand_for_file() with a NULL file pointer. - * variable.c (target_environment): Call the renamed function and - provide the current file context. - Fixes Debian bug #144306. - -2002-04-28 Paul D. Smith - - Allow $(call ...) user-defined variables to be self-referencing - without throwing an error. Allows implementation of transitive - closures, among other possibly useful things. - Requested by: Philip Guenther - - * variable.h (struct variable): Add a new field: exp_count, and - new macros to hold its size and maximum value. - (warn_undefined): Make this a macro. - * variable.c (define_variable_in_set): Initialize it. - * expand.c (recursively_expand): If we detect recursive expansion - of a variable, check the exp_count field. If it's greater than 0 - allow the recursion and decrement the count. - (warn_undefined): Remove this (now a macro in variable.h). - * function.c (func_call): Before we expand the user-defined - function, modify its exp_count field to contain the maximum - number of recursive calls we'll allow. After the call, reset it - to 0. - -2002-04-21 Paul D. Smith - - Modified to use latest autoconf (2.53), automake (1.6.1), and - gettext (0.11.1). We're using gettext's new "external" support, - to avoid including libintl source with GNU make. - - * README.cvs: New file. Explain how to build GNU make from CVS. - - * configure.in: Modify checking for the system glob library. - Use AC_EGREP_CPP instead of AC_TRY_CPP. Remove the setting of - GLOBDIR (we will always put "glob" in SUBDIRS, so automake - etc. will manage it correctly). Set an automake conditional - USE_LOCAL_GLOB to decide whether to compile the glob library. - - * getloadavg.c (main): Include make.h in the "TEST" program to - avoid warnings. - - * Makefile.am: Remove special rules for loadavg. Replace them - with Automake capabilities for building extra programs. - - * signame.c: This file does nothing if the system provide - strsignal(). If not, it implements strsignal(). If the system - doesn't define sys_siglist, then we make our own; otherwise we use - the system version. - * signame.h: Removed. - - * main.c (main): No need to invoke signame_init(). Update copyright. - - * ABOUT-NLS: Removed. - * gettext.c: Removed. - * gettext.h: Get a simplified copy from the gettext package. - * po/*: Created. - * i18n/*.po: Moved to po/. - * i18n/: Removed. - - * config/*: Created. Contains package configuration helper files. - * config.guess, config.sub: Moved to config directory. - - * configure.in (AC_CONFIG_FILES): Add po/Makefile.in, config/Makefile. - Rework to use new-style autoconf features. Use the "external" - mode for gettext. Make the build.sh config file conditional on - whether build.sh.in exists, to avoid autoconf errors. - * acinclude.m4: Removed almost all macros as being obsolete. - Rewrote remaining macros to use AC_DEFINE. - * acconfig.h: Removed. - - * Makefile.am (EXTRA_DIST): Add config/config.rpath. Use a - conditional to handle customs support. Remove special handling - for i18n features. - -2002-04-20 Paul D. Smith - - * function.c (func_call): Don't mark the argument variables $1, - etc. as recursive. They've already been fully expanded so - there's no need to do it again, and doing so strips escaped $'s. - Reported by Sebastian Glita . - - * remake.c (notice_finished_file): Walk through double-colon - entries via the prev field, not the next field! - Reported by Greg McGary . - - * main.c (main): If the user specifies -q and asks for a specific - target which is a makefile, we got an assert. In that case it - turns out we should continue normally instead. - - * i18n/de.po, i18n/fr.po: Installed an updated translation. - - * i18n/he.po: Installed a new translation. - -2002-01-07 Paul D. Smith - - * i18n/es.po, i18n/ru.po: Installed an updated translation. - -2001-12-04 Paul D. Smith - - * i18n/ja.po: Installed an updated translation. - -2001-09-04 Paul D. Smith - - * i18n/da.po: Installed an updated translation. - -2001-08-03 Paul D. Smith - - * i18n/fr.po: Installed an updated translation. - Resolves Debian bug #106720. - -2001-06-13 Paul D. Smith - - * i18n/da.po, configure.in (ALL_LINGUAS): Installed a new - translation. - -2001-06-11 Paul D. Smith - - * i18n/ko.po: Installed a new translation. - -2001-05-06 Paul D. Smith - - Modify the EINTR handling. - - * job.c (new_job): Reorganize the jobserver algorithm. Reorder - the way in which we manage the file descriptor/signal handler race - trap to be more efficient. - -2001-05-06 Paul Eggert - - Restart almost all system calls that are interrupted, instead - of worrying about EINTR. The lone exception is the read() for - job tokens. - - * configure.in (HAVE_SA_RESTART): New macro. - (MAKE_JOBSERVER): Define to 1 only if HAVE_SA_RESTART. - * main.c (main): Use SA_RESTART instead of the old, - nonstandard SA_INTERRUPT. - - * configure.in (AC_CHECK_FUNCS): Add bsd_signal. - * main.c (bsd_signal): New function or macro, - if the implementation doesn't supply it. - (The bsd_signal function will be in POSIX 1003.1-200x.) - (HANDLESIG): Remove. - (main, FATAL_SIG): Use bsd_signal instead of signal or HANDLESIG. - - * make.h (EINTR_SET): Remove. - (SA_RESTART): New macro. - - * arscan.c (ar_member_touch): Don't worry about EINTR. - * function.c (func_shell): Likewise. - * job.c (reap_children, free_child, new_job): Likewise. - * main.c (main): Likewise. - * remake.c (touch_file, name_mtime): Likewise. - - * arscan.c (ar_member_touch): Fix bug uncovered by EINTR removal; - if fstat failed with errno!=EINTR, the error was ignored. - - * job.c (set_child_handler_action_flags): New function. - (new_job): Use it to temporarily clear the SIGCHLD action flags - while reading the token. - -2001-05-02 Paul D. Smith - - * job.c (start_job_command): Don't add define/endef per-line flags - to the top-level flags setting. - -2001-04-03 Paul D. Smith - - * arscan.c (VMS_get_member_info,ar_scan) [VMS]: VMS sets the low - bit on error, so check for odd return values, not non-0 return - values. - (VMS_get_member_info): Calculate the timezone differences correctly. - Reported by John Fowler . - - -2001-03-14 Paul D. Smith - - * variable.c (lookup_variable) [VMS]: Null-terminate the variable - value before invoking define_variable(). - Reported by John Fowler . - -2001-02-07 Paul D. Smith - - * read.c (record_target_var): If we reset the variable due to a - command-line variable setting overriding it, turn off the "append" - flag. - -2001-01-17 Paul D. Smith - - * variable.c (lookup_variable) [VMS]: When getting values from the - environment, allocate enough space for the _value_ plus escapes, - not enough space for the name plus escapes :-/. - Reported by John Fowler . - - * remake.c (f_mtime): Removed the "***" prefix from the mod time - warnings that make generates, so it doesn't look like an error. - Reported by Karl Berry . - - - Fix for PR/2020: Rework appended target-specific variables. I'm - fairly confident this algorithm is finally correct. - - * expand.c (allocated_variable_append): Rewrite. Instead of - expanding each appended variable then adding all the expanded - strings together, we append all the unexpanded values going up - through the variable set contexts, then expand the final result. - This behaves just like non-target-specific appended variable - values, while the old way didn't in various corner cases. - (variable_append): New function: recursively append the unexpanded - value of a variable, walking from the outermost variable scope to - the innermost. - * variable.c (lookup_variable): Remove the code that looked up the - variable set list if the found variable was "append". We don't - need this anymore. - (lookup_variable_in_set): Make this non-static so we can use it - elsewhere. - (try_variable_definition): Use lookup_variable_in_set() rather - than faking out current_variable_set_list by hand (cleanup). - * variable.h: Add a prototype for the now non-static - lookup_variable_in_set(). - -2000-11-17 Paul D. Smith - - * remake.c (f_mtime) [WINDOWS32]: On various advice, I changed the - WINDOWS32 port to assume timestamps can be up to 3 seconds away - before throwing a fit. - -2000-11-17 Paul D. Smith - - * read.c (readline): CRLF calculations had a hole, if you hit the - buffer grow scenario just right. Reworked the algorithm to avoid - the need for len or lastlen at all. Problem description with - sample code chages provided by Chris Faylor . - -2000-10-24 Paul D. Smith - - * gettext.c (SWAP): Declare this with the prototype, otherwise - some systems don't work (non-32-bit? Reported for Cray T3E). - Reported by Thorstein Thorsteinsson . - -2000-10-05 Paul D. Smith - - * acinclude.m4 (AM_LC_MESSAGES): Remove undefined macro - AM_LC_MESSAGES; it doesn't seem to do anything anyway?? - - * i18n/gl.po, configure.in (ALL_LINGUAS): New Galician translation. - -2000-09-22 Paul D. Smith - - * gettext.c: Don't #define _GETTEXT_H here; we only include some - parts of the real gettext.h here, and we expect to really include - the real gettext.h later. If we keep this #define, it's ignored. - -2000-09-21 Paul D. Smith - - * main.c (log_working_directory): Rework the text to use complete - sentences, to make life simpler for the translators. - -2000-08-29 Paul D. Smith - - * file.c (remove_intermediates): Print a debug message before we - remove intermediate files, so the user (if she uses -d) knows - what's going on. - -2000-08-21 Paul D. Smith - - * variable.c (try_variable_definition): Change how we handle - target-specific append variable defns: instead of just setting the - value, expand it as an append _but_ only within the current - target's context. Otherwise we lose all but the last value if the - variable is appended more than once within the current target - context. Fixes PR/1831. - -2000-08-16 Paul D. Smith - - * function.c (func_shell): Nul-terminate the buffer before - printing an exec error message (just in case it's not!). - Fixes PR/1860, reported by Joey Hess . - -2000-07-25 Paul D. Smith - - * job.c (construct_command_argv_internal): Add "~" to the list of - sh_chars[] which disallow optimizing out the shell call. - -2000-07-23 Paul Eggert - - * NEWS, make.texinfo: Document .LOW_RESOLUTION_TIME, which - supersedes --disable-nsec-timestamps. - * make.texinfo: Consistently use "time stamp" instead of "timestamp". - * README: Remove --disable-nsec-timestamps. - - * filedef.h (struct file.low_resolution_time): New member. - * file.c (snap_deps): Add support for .LOW_RESOLUTION_TIME. - * remake.c (update_file_1): - Avoid spurious rebuilds due to low resolution time stamps, - generalizing the earlier code that applied only to archive members. - (f_mtime): Archive members always have low resolution time stamps. - - * configure.in: Remove --disable-nsec-timestamps, as this has - been superseded by .LOW_RESOLUTION_TIME. - -2000-07-23 Paul Eggert - - * configure.in (enable_nsec_timestamps): Renamed from - make_cv_nsec_timestamps, since enable/disable options - shouldn't be cached. - -2000-07-23 Bruno Haible - and Paul Eggert - - * file.c (file_timestamp_now): - Use preprocessor-time check for FILE_TIMESTAMP_HI_RES - so that clock_gettime is not linked unless needed. - - * filedef.h (FILE_TIMESTAMP_HI_RES): - Remove definition; "configure" now does this. - - * configure.in (jm_AC_TYPE_UINTMAX_T): Move up, - to before high resolution file timestamp check, - since that check now uses uintmax_t. - (FILE_TIMESTAMP_HI_RES): Define to nonzero if the code should use - high resolution file timestamps. - (HAVE_CLOCK_GETTIME): Do not define if !FILE_TIMESTAMP_HI_RES, - so that we don't link in clock_gettime unnecessarily. - -2000-07-17 Paul D. Smith - - * i18n/ja.po: New version of the translation file. - -2000-07-07 Paul D. Smith - - * remake.c (f_mtime): If NO_FLOAT is defined, don't bother with - the offset calculation. - (name_mtime): Replace EINTR test with EINTR_SET macro. - -2000-07-07 Paul Eggert - - Fix for PR/1811: - - * remake.c (update_file_1): - Avoid spurious rebuilds of archive members due to their - timestamp resolution being only one second. - (f_mtime): Avoid spurious warnings of timestamps in the future due to - the clock's resolution being lower than file timestamps'. - When warning about future timestamps, report only the discrepancy, - not the absolute value of the timestamp and the current time. - - * file.c (file_timestamp_now): New arg RESOLUTION. - * filedef.h (file_timestamp_now): Likewise. - (FILE_TIMESTAMP_NS): Now returns int. All uses changed. - -2000-07-05 Paul D. Smith - - * variable.c (lookup_variable) [VMS]: Remove vestigial references - to listp. Fixes PR/1793. - -2000-06-26 Paul Eggert - - * Makefile.am (MAINTAINERCLEANFILES): New macro, with stamp-pot in it. - - * dir.c (vms_hash): Ensure ctype macro args are nonnegative. - - * remake.c (f_mtime): Remove unused var memtime. - -2000-06-25 Martin Buchholz - - * make.texinfo, NEWS, TODO.private: Minor spelling corrections. - Ran spell-check on make.texinfo. - -2000-06-23 Paul D. Smith - - * main.c (main): Replace EXIT_SUCCESS, EXIT_FAILURE, and - EXIT_TROUBLE with MAKE_SUCCESS, MAKE_FAILURE, and MAKE_TROUBLE. - * make.h: Define these macros. - - * Version 3.79.1 released. - - * configure.in: Add a new option, --disable-nsec-timestamps, to - avoid using sub-second timestamps on systems that support it. It - can lead to problems, e.g. if your makefile relies on "cp -p". - * README.template: Document the issue with "cp -p". - - * config.guess, config.sub: Updated. - - - -See ChangeLog.2, available in the CVS repository at: - - http://savannah.gnu.org/cvs/?group=make - -for earlier changes. diff --git a/src/gmake/ChangeLog.1 b/src/gmake/ChangeLog.1 deleted file mode 100644 index 8f866e7c..00000000 --- a/src/gmake/ChangeLog.1 +++ /dev/null @@ -1,4980 +0,0 @@ -Tue Oct 29 20:57:36 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62. - - * remake.c (update_file_1): Check for deps still running before - giving up if any dep has failed. - -Sat Oct 26 16:20:00 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h [uts]: #undef S_ISREG and S_ISDIR if defined. - -Fri Oct 25 19:50:39 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.60.17. - -Thu Oct 24 16:58:36 1991 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * job.c (start_job): Don't check for empty cmds before tweaking the - command_ptr. Just let construct_command_argv do it. - -Tue Oct 22 20:21:03 1991 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * remake.c, arscan.c [POSIX]: instead of . - - * make.h [POSIX]: Declare vfork as pid_t. - -Mon Oct 21 15:37:30 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.60.16. - - * job.c (construct_command_argv, construct_command_argv_internal): - Take new 2nd arg RESTP. If non-NULL, stop parsing at newline, and - store addr of the NL in *RESTP. - (start_job): Don't chop expanded cmd lines up; use above code to do it. - * function.c (expand_function: `shell'): Pass RESTP==NULL. - -Sat Oct 19 15:36:34 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.60.15. - -Fri Oct 18 15:26:55 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (start_job): If on the same cmds->command_lines elt, look - at cmds->lines_recurse[CHILD->command_line - 1] instead of - [CHILD->command_line]. - - * dir.c [sgi]: , not ndir or anything else. - -Thu Oct 17 16:28:55 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * file.c (print_file_data_base): Remove unused var. - - * make.h [NeXT]: No #define ANSI_STRING. - -Tue Oct 15 20:08:41 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.60.14. - -Fri Oct 11 16:23:52 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * make.h: Use PATH_MAX for getwd defn. - - * make.h: Move getcwd/getwd outside of #ifndef POSIX, and make it - #if USG||POSIX. - -Thu Oct 10 11:53:31 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.60.13. - - * read.c (read_all_makefiles): When processing MAKEFILES, save the - malloc'd ptr to be freed, instead of freeing part-way thru it. - - * remake.c (update_file_1): Don't tweak FILE->also_make. - (update_file): Do it here. After calling update_file_1, set the - command_state, update_status, and updated members of each also_make - elt to FILE's values. - -Tue Oct 8 14:56:04 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.60.12. - - * remake.c (notice_finished_file): Set command_state of FILE and - its also_make chain to cs_finished here. - * commands.c (execute_file_commands), job.c (child_handler), - remake.c (remake_file): Don't set it before calling - notice_finished_file. - - * file.h (struct file): Changed `also_make' to struct dep *. - * job.c (delete_child_targets), file.c (print_file_data_base), - remake.c (notice_finished_file), implicit.c (pattern_search): - Use dep chain instead of array of file names. - -Mon Oct 7 17:04:33 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.60.11. - - * arscan.c: Declare open. - * misc.c: Declare {get,set}{re,}[ug]id. - * variable.c (target_environment): Declare getenv. - -Sat Oct 5 15:13:03 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * make.h [NeXT]: instead of . - -Fri Oct 4 16:05:41 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * default.c (default_suffixes, defualt_suffix_rules): Add .texi - just like .texinfo. - - * Version 3.60.10. - - * job.c: Move vfork decl into make.h. - -Fri Sep 27 18:45:30 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * compatMakefile (glob/libglob.a): Pass CC value to submake. - -Thu Sep 26 00:08:15 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * load.c (load_average): Made not static. - - * load.c [ultrix && vax]: Define LDAV_TYPE and LDAV_CVT for Ultrix 4.2. - -Tue Sep 24 00:17:20 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.60.9. - - * read.c (record_files): Warn about extra cmds even if the target's - name begins with a dot. I think the lusers can handle this. - -Mon Sep 23 22:33:26 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h, arscan.c: Don't declare bcmp, bzero, or bcopy if they're - #define'd. - * make.h: Declare write and open. - - * default.c (default_suffixes, default_suffix_rules, - default_variables): Add .C just like .cc. - * make.texinfo (Catalogue of Rules): Document .C. - - * make.man (-w): Fix gramo. - -Fri Sep 20 17:18:16 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h: No text after #endif. - -Sun Sep 15 16:20:46 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.60.8. - - * implicit.c (pattern_search): In the second pass, recurse on rule - deps that don't have a %. Why did I make it not do this? - -Fri Sep 14 18:29:39 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * read.c (record_files): For extra cmds, use the last ones given. - If the target's name doesn't begin with a dot (bletch!!), emit a - two-line warning, one line giving the old cmds' location and the - other the new cmds' location. - - * misc.c (makefile_error, makefile_fatal): New fns. - * make.h: Declare them. - * Use them instead of error/fatal for all msgs including a file - name and line number. - -Thu Sep 13 16:35:54 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * make.h: Declare define_default_variables. - Declare ar_parse_name, instead of ar_name_parse (M-t). - -Mon Sep 10 18:35:40 1991 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * Version 3.60.7. - - * make.texinfo (Variables: Setting): Say whitespace is removed if - "immediately after =", rather than simply "after =". - - * job.c: Don't declare wait #ifdef POSIX. - - * make.h [__GNUC__]: #undef alloca and then #define it. - - * main.c (main): When pruning makefiles which might loop from the - read_makefiles chain, look at all `prev' entries of double-colon rules. - -Fri Sep 7 00:41:53 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * main.c (main): Only remove makefiles with cmds but no deps from - the list of makefiles to be rebuilt if they are :: targets. - : targets with cmds and no deps are not dangerous. - -Wed Sep 5 17:35:51 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (defines): Add comment that some compilers take - ENUM_BITFIELDS but produce bogus code. - (LOAD_AVG): Fix examples to \ "s. - (LOADLIBES): Add comment that SGI Irix needs -lmld for nlist. - -Tue Sep 4 20:26:26 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.60.6. - -Fri Aug 30 19:34:04 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * remake.c (update_file_1): When checking the command_state of - deps, check through the prev chain. - (update_goal_chain): When a target is finished, start checking its - prev (if it has one) instead. - -Wed Aug 7 17:32:03 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * rule.c (convert_to_pattern): Allow files with deps to define - suffix rules (really this time). - -Mon Aug 5 17:09:21 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * misc.c (user_access, make_access): Do saved-IDs (USG) flavor - #ifdef POSIX. - - * file.c (enter_file): Strip ./s here. - * read.c (parse_file_seq): Not here. - -Tue Jul 23 23:34:30 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile: Added comment that -lPW alloca is broken on HPUX. - -Thu Jul 18 03:10:41 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.60.5. - - * read.c (read_makefile): Ignore lines containing chars that are - all isspace, not just all isblank. - - * make.texinfo (Copying): @include gpl.texinfo, rather than copying - the text. - * gpl.texinfo: New file (symlink to /gd/gnu/doc/gpl.texinfo). - * GNUmakefile: Put gpl.texinfo in distribution. - -Tue Jul 16 12:50:35 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * make.h: #define _GNU_SOURCE before including headers. - Include and define isblank if doesn't. - * commands.c: Don't include here. - * *.c: Use isblank instead of explicit ' ' || '\t'. - -Mon Jul 15 17:43:38 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * function.c (expand_function: `filter'/`filter-out'): Fixed to not - loop infinitely. - -Fri Jul 12 12:18:12 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * function.c (expand_function: `filter'/`filter-out'): Rewritten to - handle filter-out of multiple patterns properly. Also no longer - mallocs and reallocs for temp array; uses alloca and a linked-list - instead. - -Wed Jul 10 22:34:54 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.60.4. - - * make.texinfo: Moved some @groups that were outside @examples to - be inside them. - - * load.c [apollo] (load_average): Define using special syscall for - Apollo DOMAIN/OS SR10.n. - -Thu Jul 4 12:32:53 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * make.texinfo (Missing): Added Unix excessive implicit rule - search; mention that POSIX.2 doesn't require any of the missing - features. - (Top): Updated printed manual price to $15. - -Wed Jul 3 18:17:50 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * file.c (rename_file): Carry over last_mtime when merging files. - * remake.c (f_mtime): Tail-recurse after renaming VPATH file, to - check for saved date in existing renamed-to file. - - * remote-cstms.c (start_remote_job): Use PATH_VAR. - - * commands.c [POSIX || __GNU_LIBRARY__]: Don't declare getpid. - - * compatMakefile (glob-{clean,realclean}): Run clean/realclean in glob. - (clean, realclean): Require those. - - * make.h: Always declare environ. - Don't declare old glob functions. - - * GNUmakefile: Make no-lib deps for load.c and remote.c. - -Tue Jul 2 18:35:20 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.60.3. - -Mon Jul 1 16:58:30 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (multi_glob): Don't pass GLOB_QUOTE flag to glob. - - * make.h [POSIX]: Include , and don't declare things that - should be there. - - * main.c (main) [USG && sgi]: malloc a buffer for broken sgi stdio. - -Sat Jun 29 11:22:21 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * function.c (expand_function: `shell'): Use alloca for the error - msg buffer, instead of assuming an arbitrary max size. - -Fri Jun 28 18:15:08 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c [POSIX] (search_path): Do real 1003.1 goop to get NGROUPS_MAX. - -Wed Jun 26 11:04:44 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * default.c (define_default_variables): New fn. - (install_default_implicit_rules): Code for above fn moved there. - * main.c (main): Do define_default_variables before reading the - makefile. - -Tue Jun 25 17:30:46 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * main.c (main): Quote ; in MAKEOVERRIDES. - -Tue Jun 18 13:56:30 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * compatMakefile: Fixed typo in comment. - -Tue Jun 11 00:14:59 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.60.2. - -Mon Jun 10 14:46:37 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h: Always include . - [POSIX]: Include and #define MAXPATHLEN to be PATH_MAX. - - * default.c (default_suffix_rules: .texinfo.dvi): Use $(TEXI2DVI). - (default_variables): Define TEXI2DVI. - -Thu Jun 6 16:49:19 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.60.1. - - * make.h (SIGNAL): Cast handler arg to SIGHANDLER type. - -Wed Jun 5 06:00:43 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * read.c (multi_glob): Use POSIX.2 `glob' function. - If a glob pattern matches nothing, leave it as is (a la sh, bash). - Also, if can't find USER for ~USER, leave it as is (a la bash). - -Mon Jun 3 16:36:00 1991 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * compatMakefile: Rewrote comments about -Ds to be easier to use. - - * make.h, arscan.c, remake.c, main.c, dir.c, job.c: Changed tests - of _POSIX_SOURCE to POSIX. - - * job.c: Take getdtablesize out of #ifdef __GNU_LIBRARY__. - Put separately #ifdef USG. - - * COPYING: Replaced with version 2. - * Changed copyright notices to refer to GPL v2. - -Thu May 30 00:31:11 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h: Don't declare sigblock for POSIX. - - * main.c (main, log_working_directory) [USG]: Get getcwd failure - mode from errno, not passed buffer like BSD getwd. - - * misc.c (child_access): New fn to set access for a child process; - like user_access, but you can't change back. - * make.h: Declare it. - * job.c (exec_command): Use it in place of user_access. - -Wed May 29 23:28:48 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * default.c (default_variables) [pyr]: PC = pascal. - -Tue May 28 20:24:56 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.c (print_variable): Put a newline before `endef'. - -Sat May 25 02:39:52 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.60. - -Wed May 22 19:41:37 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.59.5. - -Thu May 16 13:59:24 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (main): Do USGr3 setvbuf behavior #ifdef APOLLO. - Don't handle SIGCHLD #ifdef USG (Apollo is USG but defines SIGCHLD). - -Fri May 10 14:59:33 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * remake.c [sgi]: Don't include . - -Wed May 8 01:54:08 1991 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * make.h (SIGHANDLER): #define as (void *) #if __STDC__, - else (int (*)()). - (SIGNAL): Use it to cast return value. - * main.c (main): Cast SIG_IGN to SIGHANDLER when comparing. - * job.c (block_signals, unblock_signals): Use SIGNAL instead of signal. - - * main.c: Declare mktemp to return char*, not int. - - * job.c (new_job): Don't increment files_remade. - * remake.c (notice_finished_file): Do it here. - - * read.c (do_define): Don't clobber DEFINITION[-1] on empty defns. - Free storage that is no longer needed. - -Wed Apr 24 20:49:48 1991 Roland McGrath (roland at churchy.gnu.ai.mit.edu) - - * misc.c (message): New fn to print informational msgs with - leading "make: " or "make[N]: ". - * make.h: Declare it. - * remake.c (update_file): Use it instead of printf. - -Fri Apr 19 05:52:45 1991 Roland McGrath (roland at churchy.gnu.ai.mit.edu) - - * main.c (main): When there are no targets, if there were no - makefiles, print a different error message, which mentions makefiles. - -Tue Apr 16 03:22:45 1991 Roland McGrath (roland at geech.gnu.ai.mit.edu) - - * remake.c (update_file): Print "nothing to be done" instead of "is - up to date" if FILE->cmds == 0. - - * job.c [!WIFEXITED]: Define if not already defined. - -Thu Apr 11 18:00:50 1991 Roland McGrath (roland at wookumz.gnu.ai.mit.edu) - - * arscan.c (ar_name_equal): Fixed truncation comparison. - -Tue Apr 2 16:17:35 1991 Roland McGrath (roland at churchy.gnu.ai.mit.edu) - - * glob.c: Use common version from djm. - * dir.c: Snarfed #ifdef mess for or whatever from glob.c. - (dir_file_exists_p): Ignore directory entries with d_ino==0. - -Mon Apr 1 20:49:45 1991 Roland McGrath (roland at albert.gnu.ai.mit.edu) - - * Version 3.59.4. - -Fri Mar 29 19:16:18 1991 Roland McGrath (roland at albert.gnu.ai.mit.edu) - - * job.c (free_child): Free CHILD->environment and its elts. - -Sat Mar 23 14:08:09 1991 Roland McGrath (roland at albert.gnu.ai.mit.edu) - - * read.c (read_makefile): Don't ignore lines containing only - comments if they start with a tab. Such lines should be passed to - the shell for it to decide about the comments. - - * job.c (free_child): Free CHILD->command_lines and its elts, not - CHILD->commands (which is obsolete). - * job.h, job.c: Remove obsolete `commands' member of `struct child'. - -Sun Mar 17 18:40:53 1991 Roland McGrath (roland at albert.ai.mit.edu) - - * remake.c (update_file): Print a msg for a top-level up-to-date - phony target (a different one than for a real file). - - * read.c (conditional_line): Boundary check so we don't check the - value of the -1th elt of the stack (which is bogus). - -Sat Mar 16 16:58:47 1991 Roland McGrath (roland at albert.ai.mit.edu) - - * read.c (conditional_line): Don't evaluate an if* when we're - already ignoring. Instead, just push a new level, with a value of - 1, to keep ignoring. - -Tue Mar 12 00:16:52 1991 Roland McGrath (roland at geech.ai.mit.edu) - - * Version 3.59.3. - -Mon Mar 11 23:56:57 1991 Roland McGrath (roland at geech.ai.mit.edu) - - * job.c (construct_command_argv_internal): Quote backslashes - when building the shell -c line. - -Fri Mar 8 01:40:18 1991 Roland McGrath (roland at geech.ai.mit.edu) - - * job.c (exec_command): Call user_access rather than setgid(getgid()). - - * misc.c (remove_comments): Renamed from collapse_line; took out - collapse_continuations call. - * make.h: Change decl. - * read.c (read_makefile): Collapse continuations on the line buffer - immediately after reading it. Call remove_comments rather than - collapse_line (which is now defunct). - -Thu Feb 21 18:06:51 1991 Roland McGrath (mcgrath at cygint.cygnus.com) - - * misc.c (user_access, make_access): New fns to toggle btwn permissions - for user data (files and spawning children), and permissions for make - (for taking the load average, mostly). - * make.h: Declare them. - * job.c (start_job): Call make_access before wait_to_start_job, and - user_access after. - * main.c (main): Call user_access before doing much. - -Mon Feb 3 15:02:03 1991 Roland McGrath (roland at albert.ai.mit.edu) - - * Version 3.59.2. - -Tue Jan 29 20:30:50 1991 Roland McGrath (roland at cygint.cygnus.com) - - * read.c (read_all_makefiles): Use allocated_variable_expand to expand - `$(MAKEFILES)', since the results are used across calls to - read_makefile, which could clobber them. - -Wed Jan 23 00:24:10 1991 Roland McGrath (roland at cygint.cygnus.com) - - * main.c (main): Call install_default_implicit_rules after reading - makefiles, not before. - * default.c (install_default_implicit_rules): If a suffix-rule file - entry has cmds, don't give it any from default_suffix_rules. - -Fri Jan 17 17:39:49 1991 Roland McGrath (roland at albert.ai.mit.edu) - - * arscan.c: Added support for AIX archives. - - * remake.c: Don't include ar.h. - * main.c: Removed unused atol decl. - * arscan.c (ar_scan): Declare arg FUNCTION to return long int. - * ar.c (ar_touch): Don't perror for an invalid archive. - * make.h: Declare lseek as long int. - - * job.c [hpux]: Define getdtablesize a la USG. - -Sun Jan 12 21:08:34 1991 Roland McGrath (roland at albert.ai.mit.edu) - - * Version 3.59.1. - -Fri Jan 10 03:48:08 1991 Roland McGrath (roland at albert.ai.mit.edu) - - * job.c (search_path): Take new arg, place to put full pathname (rather - than mallocing it). - (exec_command): Pass it, using auto storage. - - * main.c (print_version): Updated copyright years. - -Wed Jan 8 19:46:19 1991 Roland McGrath (roland at albert.ai.mit.edu) - - * job.c [_POSIX_SOURCE]: Just #include , and define macro - WAIT_NOHANG in terms of waitpid. - [!_POSIX_SOURCE && (HAVE_SYS_WAIT || !USG)]: Don't #include - (make.h does). - Define macro WAIT_NOHANG in terms of wait3. - (child_handler): #ifdef on WAIT_NOHANG, not HAVE_SYS_WAIT || !USG. - Use WAIT_NOHANG macro instead of wait3. - - * file.h (struct file.command_state): Remove unused elt. - -Wed Dec 26 18:10:26 1990 Roland McGrath (roland at albert.ai.mit.edu) - - * commands.c (set_file_variables): If FILE got its commands from - .DEFAULT, make $< == $@ (4.3 BSD/POSIX.2d11 compat). - -Mon Dec 24 17:36:27 1990 Roland McGrath (roland at albert.ai.mit.edu) - - * default.c (default_variables): Rename 2nd LINK.s defn to LINK.S. - -Fri Dec 14 15:05:25 1990 Roland McGrath (roland at albert.ai.mit.edu) - - * vpath.c (selective_vpath_search): Check for makefile-mentioned before - checking for actual existence. The old order loses if the containing - directory doesn't exist (but a rule might make it). - - * make.h [__GNUC__]: Don't #define alloca if already #define'd. - - * rule.c (convert_to_pattern): Don't look at the target constructed for - the empty rule when making the null-suffix rule. Construct it over - again, since the former may have been freed already. - -Thu Dec 13 17:21:03 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * make.h [__GNU_LIBRARY__]: Include to get random fn decls. - -Wed Dec 12 17:12:59 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * make.h, arscan.c, glob.c: Only include #ifdef USG. - - * variable.c (define_variable_in_set): Replace env_overrides check that - wasn't really redundant (undoing Sep 28 change). Add comment saying - why this check is necessary. - - * job.c, main.c [DGUX]: Needs siglist like USG. - -Mon Dec 11 01:19:29 1990 Roland McGrath (roland at albert.ai.mit.edu) - - * default.c [M_XENIX]: For rules that are different for Xenix, use the - generic Unix version #ifdef __GNUC__. - - * main.c [M_XENIX]: Use USGr3-style setvbuf call. - - * read.c (find_percent): Do backslash folding correctly, not leaving - extra crud on the end of the string. - -Sun Dec 10 21:48:36 1990 Roland McGrath (roland at albert.ai.mit.edu) - - * job.c: Don't declare wait3 if it's #defined. - - * GNUmakefile, compatMakefile, make.texinfo: Change make-info - to make.info. - -Thu Dec 7 21:20:01 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * make.h [STDC_HEADERS || __GNU_LIBRARY__ || _POSIX_SOURCE]: Use - ANSI and names for str/mem functions. - Use to declare misc fns rather than explicit decls. - [_POSIX_SOURCE]: Don't declare kill ( will). - Include before because some braindead - nonconformant 1003.1 implementation needs it. - * misc.c: Don't declare malloc, realloc. Do it in make.h. - * arscan.c, glob.c: Use sequence for string fns from make.h verbatim. - * make.h (S_ISDIR, S_ISREG): Declare if necessary. - * commands.c (delete_child_targets), job.c (search_path), read.c - (construct_include_path): Use S_ISfoo(m) instead of - (m & S_IFMT) == S_IFfoo. - * dir.c, glob.c [_POSIX_SOURCE]: Use dirent. - -Wed Nov 29 22:53:32 1990 Roland McGrath (roland at geech.ai.mit.edu) - - * Version 3.59. - -Tue Nov 28 16:00:04 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * arscan.c (ar_name_equal) [APOLLO]: Don't do `.o' hacking. On Apollos - the full file name is elsewhere, and there is no length restriction (or - so I'm told). - -Thu Nov 23 17:33:11 1990 Roland McGrath (roland at albert.ai.mit.edu) - - * load.c [hp300 && BSD] (LDAV_CVT): Define for this system. - -Tue Nov 21 07:58:40 1990 Roland McGrath (roland at albert.ai.mit.edu) - - * read.c (record_files): Fix trivial bug with deciding to free storage - for a file name. - -Thu Nov 16 06:21:38 1990 Roland McGrath (roland at geech.ai.mit.edu) - - * compatMakefile ($(bindir)/make): Install it setgid kmem. - -Thu Nov 1 16:12:55 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * GNUmakefile (make-*.tar.Z): Use `h' option to tar (dereference - symlinks), to grab texinfo.tex from wherever it lives. - -Tue Oct 30 16:15:20 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * Version 3.58.13. - -Fri Oct 26 14:33:34 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * GNUmakefile: make-*.tar.Z: Include texinfo.tex. - -Tue Oct 23 19:34:33 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * main.c (define_makeflags): When there are no flags to write, make - sure the array has two leading nulls, since `MAKEFLAGS' is defined from - &flags[1]. - - * main.c (default_keep_going_flag): New variable (constant one). - (command_switches: -k, -S): Use above for default value. - (define_makeflags): Only write flag/flag_off switches if they are on, - and either there is no default value, or they are not the default. - -Mon Oct 22 16:14:44 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * main.c (struct command_switch): New member `no_makefile'. - (command_switches: -n, -q, -t): Set no_makefile == 1. - (define_makeflags): Take new arg MAKEFILE: if nonzero, don't use - options whose `no_makefile' flags are set. - (main): Call define_makeflags with MAKEFILE==1 before remaking - makefiles, and again with MAKEFILE==0 before remaking goals. - -Tue Oct 2 17:16:45 1990 Roland McGrath (roland at geech.ai.mit.edu) - - * Version 3.58.12. - -Mon Oct 1 15:43:23 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * arscan.c [HPUX]: Use PORTAR==1 format. - -Sat Sep 29 16:38:05 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * make.h, remake.c, arscan.c: Don't declare `open'. - -Fri Sep 28 04:46:23 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * variable.c (define_variable_in_set): Remove redundant -e check. - -Wed Sep 26 00:28:59 1990 Roland McGrath (roland at geech.ai.mit.edu) - - * job.c (start_job): Set RECURSIVE from the right elt of - CHILD->file->cmds->lines_recurse. - - * commands.c (chop_commands): Don't botch the line count for allocating - CMDS->lines_recurse. - - * Version 3.58.11. - - * job.c (start_job): Don't always increment CHILD->command_line! Only - do it when CHILD->command_ptr has run out! (Dumb bug. Sigh.) - -Thu Sep 20 02:18:51 1990 Roland McGrath (roland at geech.ai.mit.edu) - - * GNUmakefile [ARCH]: Give explicit rule for remote.{c,dep} to use - variable `REMOTE' for more flags. - ($(prog)): Link in $(LOADLIBES). - -Wed Sep 19 02:30:36 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * commands.h (struct commands): New member `ncommand_lines', the number - of elts in `command_lines' et al. - * commands.c (chop_commands): Set `ncommand_lines' elt of CMDS, and - don't put a nil pointer at the end of `command_lines'. - * job.h (struct child): New member `command_lines' to hold - variable-expanded command lines. - * job.c (new_job): Store expanded command lines in `command_lines' - member of new child. Don't clobber FILE->cmds. - (start_job): Use CHILD->command_lines in place of - CHILD->file->cmds->command_lines. - - * variable.h, variable.c, job.c, expand.c: Undo yesterday's change, - which is no longer necessary since we have cleverly avoided the issue. - - * job.c (start_job): Don't variable-expand each command line. - (new_job): Do them all here, storing the expansions in the array. - -Tue Sep 18 01:23:13 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * variable.h (struct variable): Remove `expanding' member. - * variable.c (define_variable_in_set): Don't initialize it. - * expand.c (struct variable_expanding): New type, a linked list - containing `struct variable' pointers. - (variables_expanding): New variable, the chain of variables currently - being expanded. - (recursively_expand): Don't test and set `expanding' member. - Instead, run through the `variables_expanding' chain looking for a link - referring to V to find self-reference. Add a new link to the chain, - describing V, before recursive expansion, and pop it off afterward. - * job.c (child_handler): Save `variables_expanding' and clear it before - calling start_job, and restore it afterward. This avoids major lossage - when the SIGCHLD comes in the middle of variable expansion. - -Mon Sep 17 14:46:26 1990 Roland McGrath (roland at geech.ai.mit.edu) - - * job.c, commands.c: Don't define sigmask. - * make.h: Put it here instead. - - * variable.c (target_environment): If `.NOEXPORT' was specified as a - target, only export command-line and environment variables, and - file-origin variables that were in the original environment. - - * make.man: Add missing ?roff control for `-I' option description. - -Thu Sep 13 14:10:02 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * load.c [UMAX]: Move #include to [not UMAX_43]. - -Wed Sep 12 15:10:15 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * expand.c (recursively_expand): Don't use `reading_filename' and - `reading_lineno_ptr' if they're nil. - -Thu Aug 30 17:32:50 1990 Roland McGrath (roland at geech) - - * Version 3.58.10. - -Tue Aug 28 04:06:29 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * job.c [USG] (unknown_children_possible): New variable, set nonzero - when it's possible for children not in the `children' chain to die. - (block_signals) [USG]: Set it. - (unblock_signals) [USG]: Clear it. - (child_handler) [USG]: Don't complain about unknown children if - `unknown_children_possible' is set. - - * read.c (do_define): Make sure there's enough space for the newline, - so we don't write off the end of allocated space. - - * arscan.c (ar_name_equal): Fixed to work when MEM is AR_NAMELEN-1 but - NAME is not the same length. - -Sat Aug 25 16:17:14 1990 Roland McGrath (roland at geech) - - * job.c (construct_command_argv_internal): Use a static char array for - a constant, since old C has no auto aggregate initializers. - -Thu Aug 23 16:11:03 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * job.c (search_path): If PATH is nil or "" use a default path. - -Wed Aug 22 01:05:32 1990 Roland McGrath (roland at churchy.ai.mit.edu) - - * Version 3.58.9. - - * job.c (exec_command): Don't take PATH and SHELL args. Get them from - ENVP. - (child_execute_job): Don't take FILE arg, and don't pass path and shell - to exec_command. - (start_job): Don't pass FILE arg to child_execute_job. - * function.c (expand_function: `shell'): Ditto. - * main.c (main): Don't pass path and shell to exec_command. - -Fri Aug 17 23:17:27 1990 Roland McGrath (roland at geech) - - * job.c (construct_command_argv_internal): New fn broken out of - construct_command_argv. Takes strings SHELL and IFS instead of doing - variable expansion for them. Recurse to make an argv for SHELL, - passing SHELL==0. When SHELL==0, don't recurse for shell argv; make a - simple one using /bin/sh. - (construct_command_argv): Do the variable expansions and call above. - -Thu Aug 16 19:03:14 1990 Roland McGrath (roland at geech) - - * read.c (multi_glob): For ~USER/FILE, if USER isn't found, don't - change the file name at all. - -Tue Aug 7 18:33:28 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * function.c (expand_function: `suffix'/`notdir'): Don't kill the last - space if we never wrote one. - - * function.c (expand_function: `suffix'): Retain the dot, like the - documentation says. - -Mon Aug 6 14:35:06 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.58.8. - - * main.c (decode_switches): For positive_int and floating cases, move - SW past the arg (and don't set it to ""), so another switch can follow. - -Fri Aug 3 00:43:15 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * job.c (child_execute_job): Use unblock_signals instead of - push_signals_blocked_p (0). - - * main.c (fatal_signal_mask): New variable, mask of signals caught with - fatal_error_signal. - (main): Set it. - * job.c ({block,unblock}_children): Renamed to {block,unblock}_signals. - Block/unblock both child signal and signals in fatal_signal_mask. - (children_blocked_p_{stack,max,depth}, {push,pop}_children_blocked_p): - Renamed from children to signals. Use {block,unblock}_signals instead - of {block,unblock}_children. - * commands.c (fatal_error_signal), job.c (wait_for_children, new_job, - child_execute_job, main, log_working_directory), function.c - (expand_function: `shell'), job.h: Rename {push,pop}_children_blocked_p - to {push,pop}_signals_blocked_p. - * job.c (child_handler): Call {block,unblock}_signals instead of just - {block,unblock}_remote_children. We need to block the fatal signals. - -Thu Aug 2 22:41:06 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * main.c, function.c: Fixed typos in comments. - - * file.c (print_file_data_base): Fix computation of avg files/bucket. - -Tue Jul 31 22:11:14 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.58.7. - -Wed Jul 25 16:32:38 1990 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * arscan.c (ar_name_equal): Fixed to really do it right. - (ar_member_pos): Fixed order of args. - * ar.c (ar_member_date_1): Ditto. - -Fri Jul 20 15:30:26 1990 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * arscan.c (ar_name_equal): Rewritten. Accounts for a possible - trailing slash in MEM. - - * remake.c (f_mtime): Keep track of whether ARNAME is used and free it - if not. Also free MEMNAME. - * ar.c (ar_member_date, ar_touch): Ditto. - - * arscan.c (arscan) [HPUX or hpux]: Treat same as USGr3 PORTAR==1. - - * make.h: If NSIG is not defined, but _NSIG is, #define NSIG _NSIG. - - * compatMakefile: Don't use $* in explicit rules. - - * default.c (default_variables: "PREPROCESS.S"): Include $(CPPFLAGS). - - * remake.c (f_mtime): If FILE is an ar ref, get the member modtime. - - * function.c (string_glob): Terminate the string properly when it's - empty. - -Wed Jul 18 11:26:56 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.58.6. - - * commands.c (set_file_variables): Fixed computation for ^F/?F elt len. - -Sat Jul 14 13:41:24 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * job.c (construct_command_argv): Always use - allocated_variable_expand_for_file instead of variable_expand_for_file - because we might be called from inside a variable expansion (for the - `shell' function). - - * function.c (expand_function: `shell'): Free the arglist's storage - correctly. construct_command_argv only allocates ARGV and ARGV[0]. - - * job.c (children_blocked_p_idx): Renamed to children_blocked_p_depth. - (push_children_blocked_p, pop_children_blocked_p): Use ..._depth - instead of ..._idx, and do it right! - -Wed Jul 11 15:35:43 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * make.h (SIGNAL): New macro to replace `signal' calls. Does arg and - ret value casts to (void *) #ifdef __STDC__ to avoid conflicts btwn - ANSI and BSD `signal' and handler types. - * main.c (main), job.c (child_handler): Use it. - -Fri Jul 6 00:00:38 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * ar.c (ar_member_date, ar_touch): Pass 2nd arg to f_mtime. - - * read.c (read_makefile): Search the include path for MAKEFILES - variable makefiles (TYPE == 1), like it says in the manual. - - * file.h (struct file), main.c (struct command_switch): Remove trailing - commas from enums. - - * commands.c (execute_file_commands): Remove unused variables. - * commands.h: Declare chop_commands. - * make.h: Declare uniquize_deps. - * main.c (main): Remove unused variable. - (decode_switches): Remove unused label. - * remake.c: Include "ar.h" for ar_parse_name decl. - * implicit.c (try_implicit_rule): Remove unused variable. - * function.c (expand_function: `shell'): Declare fork, pipe. - * ar.c: Declare ar_name_equal. - - * GNUmakefile: If using gcc, add warning flags to CFLAGS. - - * remake.c: Remove decl of ar_member_date, since it's done in make.h. - - * remake.c (f_mtime): For ar refs, allow the archive to be found via - VPATH search if we're searching, and change the ar ref accordingly. - - * ar.c (ar_parse_name): New global fn to parse archive-member - references into the archive and member names. - (ar_member_date, ar_touch): Use it. - * make.h: Declare it. - - * remake.c (f_mtime): After doing rename_file, do check_renamed instead - of assuming rename_file will always set FILE->renamed (which it won't). - - * vpath.c (selective_vpath_search): Only accept prospective files that - don't actually exist yet are mentioned in a makefile if the file we are - searching for isn't a target. - -Wed Jul 4 04:11:55 1990 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * remake.c (update_goal_chain): Do check_renamed after calling - file_mtime. - (check_dep): Ditto after update_file. - - * file.c (rename_file): Prettied up long message for merging cmds. - - * remake.c (update_file_1): Get each dep file's modtime, and allow for - it being renamed, before checking for a circular dep, since a renaming - may have introduced one. - -Tue Jul 3 18:15:01 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * ar.c (ar_touch): Don't free ARNAME since enter_file holds onto the - storage. - - * function.c (string_glob): Don't leave a trailing space. - - * read.c (do_define): Allow leading whitespace before `endef'. - -Mon Jul 2 14:10:16 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * implicit.c (pattern_search): No longer take NAME arg. Instead take - ARCHIVE flag. If ARCHIVE is nonzero, FILE->name is of the form - "LIB(MEMBER)"; rule for "(MEMBER)" is searched for, and LASTSLASH is - set to nil. Since NAME was only non-nil when it was the archive member - name passed by try_implicit_rule, this change easily allows turning off - LASTSLASH checking for archive members without excessive kludgery. - (try_implicit_rule): Pass ARCHIVE flag instead of file name. - - * Version 3.58.5. - - * commands./c (set_file_variables): Don't kill last char of $(^D) elts. - -Sat Jun 30 00:53:38 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * ar.c (ar_member_date): Don't free ARNAME since enter_file holds onto - the storage. - - * arscan.c (ar_scan) [sun386 && PORTAR == 1]: Treat like USGr3. - -Wed Jun 27 14:38:49 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * main.c (main): Put a newline on the debugging message when deciding - not to remake a makefile to avoid a possible loop. - Only decide not to remake makefiles that have commands (as well as - being targets and having no deps). - -Fri Jun 22 12:35:37 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * default.c (default_variables): Define `LINK.s' and `LINK.S'. - (default_suffix_rules): Define .S.o rule. - - * job.c (construct_command_argv): If we decide to go the slow route, - free all storage for the chopped args. - (start_job): Free the argument list's storage correctly. - construct_command_argv only allocates ARGV and ARGV[0]. - -Tue Jun 19 18:27:43 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.58.4. - -Fri Jun 15 21:12:10 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * glob.c: New version from ai-lab which doesn't do [^abc]. - -Thu Jun 7 00:30:46 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * dir.c: Copied dirent vs direct et al mess from glob.c. - - * glob.c: Replaced with updated version from djm. - * glob.c: Check macro DIRENT instead of _POSIX_SOURCE for . - __GNU_LIBRARY__ implies DIRENT and STDC_HEADERS. - -Thu May 31 22:19:49 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * vpath.c (vpath_search): Don't stop the loop if a pattern matches but - the search fails. All matching patterns have their paths searched - (like it says in the manual). - - * make.texinfo (Rules: Directory Search: Selective Search): Say that - multiple `vpath' directives with the same pattern DO accumulate, not - supersede earlier ones. - - * vpath.c (print_vpath_data_base): Increment the count of vpaths on - each loop iteration, rather than letting it stay zero. - - * Version 3.58.3. - - * job.c (block_children, unblock_children): Made static. - (push_children_blocked_p, pop_children_blocked_p): New functions to - push and pop whether children are blocked or not. - * job.h: Declare push_children_blocked_p, pop_children_blocked_p and - not block_children, unblock_children. - * commands.c (fatal_error_signal), job.c (wait_for_children, new_job, - child_execute_job), main.c (main, log_working_directory): Use sequences - of push_children_blocked_p (1) and pop_children_blocked_p () instead of - explicitly blocking and unblocking children. - * function.c (expand_function: `shell'): Don't unblock children. The - push-pop sequence in wait_for_children makes it unnecessary. - -Tue May 29 21:30:00 1990 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * read.c (do_define): Don't include the last newline in the definition. - - * function.c (expand_function: `shell'): Call construct_command_argv - before forking and don't fork if it returns nil. Free the argument - list's storage before finishing. - - * job.c (start_job): Free the storage for the child's argument list - in the parent side of the fork after the child has been spawned. - - * job.c (start_job): If construct_command_argv returns nil, go to the - next command line. - - * job.c (construct_command_argv): Use the shell if the command contains - an unterminated quote. - -Wed May 23 19:54:10 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.58.2. - - * read.c (read_makefile): Parse "override define" correctly. - -Thu May 17 15:25:58 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * arscan.c [USG]: Don't declare memcpy and memcmp. should - do this anyway (and lack of declarations is harmless). - - * remote-customs.c: Renamed to remote-cstms.c for System V. - * remote.c [CUSTOMS]: Changed accordingly. - -Sun May 13 14:38:39 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * GNUmakefile: Use same cmds for doc tar.Z as for dist tar.Z (so the - contents go in make-N.NN). - -Thu Apr 26 19:33:25 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * Version 3.58.1. - -Wed Apr 25 20:27:52 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * job.c (init_siglist): Don't do SIGUSR1 and SIGUSR2 if they are the - same as SIGIO and SIGURG (true on Cray). - -Tue Apr 24 20:26:41 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * arscan.c (ar_scan): Do behavior for PORTAR == 1 and USGr3 also - #ifdef APOLLO. - -Wed Apr 11 10:00:39 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * job.c (exec_command): Set the effective GID to the real GID. Somehow - this code got lost. - - * implicit.c (pattern_search): Use the right index variable when - seeing if we need to expand FILE->also_make. - -Sun Mar 4 09:18:58 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * Version 3.58.0. - - * remake.c (remake_file): Treat non-targets without commands under -t - the same as anything else without commands. - -Sat Feb 24 17:46:04 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * default.c (default_variables: PREPROCESS.S): Removed $< from defn. - - * main.c (main): Ignore arguments that are the empty string, rather - than feeding them to enter_file and barfing therein. - -Wed Feb 14 16:28:37 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * main.c (main): Call construct_include_path after doing chdirs. - -Thu Feb 8 13:43:44 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * Version 3.58. - -Sat Feb 3 22:06:55 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * Version 3.57.7. - - * make.texinfo (Implicit: Catalogue of Rules): For RCS, noted that - working files are never overwritten by the default rule. - -Thu Feb 1 17:27:54 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * rule.c (count_implicit_rule_limits): Redid loop control to not run - twice on freed rules. - - * GNUmakefile: Made `.dep' files be architecture-specific too. - - * main.c (main, log_working_directory) [USG]: Block children around - calls to `getwd' (actually `getcwd' on USG), because that function - sometimes spawns a child running /bin/pwd on USG. - -Tue Jan 30 14:02:50 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * function.c (subst_expand): Pay attention to SUFFIX_ONLY, putz. - -Wed Jan 24 21:03:29 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * make.man: Fixed repeated word. - - * make.texinfo (Missing): Reworded a buggy sentence. - -Mon Jan 22 12:39:22 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * main.c (print_version): Added 1990 to copyright notice. - - * Version 3.57.6. - -Sat Jan 20 11:52:01 1990 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * file.c (rename_file): Don't free the storage for the old name, since - it might not have been malloc'd. - - * job.c (construct_command_argv): Call - allocated_variable_expand_for_file instead of variable_expand_for_file - to expand `$(SHELL)'. - - * make.texinfo (Bugs): Change address from roland@wheaties.ai.mit.edu - to roland@prep.ai.mit.edu. - -Tue Jan 16 19:22:33 1990 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * Version 3.57.5. - -Sun Jan 14 16:48:01 1990 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * job.c (start_job): Only call wait_to_start_job for the first command - line in each sequence. - -Thu Jan 4 14:27:20 1990 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * load.c [LDAV_BASED] (wait_to_start_job): Loop while job_slots_used > - 0, not > 1. - - * job.c (search_path): Don't return a pointer to local storage. - Allocate data space for the pathname instead. - - * function.c (expand_function: `shell'): Don't write garbage if the - child wrote no output. - -Wed Jan 3 15:28:30 1990 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.57.4. - - * file.h (struct file): New member `renamed', a `struct file *' that is - the place this file has been renamed to (or nil). - (check_renamed): Macro to check for a file having been renamed. - Dereferences the renaming and sets the given variable. - * file.c (rename_file): Completely rewritten. Renames in place if - possible, or moves FILE to a different hash bucket if there is no - existing file with the new name. If there is an existing file with the - new name, FILE is merged into it and FILE->renamed is set to point to - it. - * variable.c (merge_variable_sets): New fn to merge two variable sets. - (merge_variable_set_lists): New fn to merge two variable set lists. - * variable.h: Declare merge_variable_set_lists. - * remake.c (update_file_1, check_dep): Run `check_renamed' after - calling file_mtime, check_dep. - (update_file): Same after update_file_1. - (update_goal_chain, update_file_1, check_dep): Same after update_file. - - * read.c (uniquize_deps): New fn, broken out of record_files, to remove - duplicate deps from a chain. - (record_files): Use it. - * implicit.c (pattern_search): Use uniquize_deps. - - * file.h (file_mtime_1): New macro, like file_mtime, but take second - arg, passed to f_mtime. - (file_mtime): Implement as file_mtime_1 (file, 1). - (file_mtime_no_search): New macro: file_mtime (file, 0). - * remake.c (f_mtime): Take new arg SEARCH. Only do VPATH and `-lNAME' - searching if it is nonzero. - * main.c (main): Use file_mtime_no_search for makefiles. - * remake.c (update_goal_chain): Use file_mtime_no_search if MAKEFILES. - - * main.c (printed_version): New variable, init'd to zero. - (print_version): Set it to nonzero before returning. - (die): If -v and !printed_version, call print_version before clean up - and death. - - * main.c (log_working_directory): Keep track of whether or not the - "Entering" message has been printed, and return without printing the - "Leaving" message if not. - - * main.c (decode_switches): Don't complain about missing args before - checking for a noarg_value elt in the command_switch structure. - -Tue Jan 2 15:41:08 1990 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * make.texinfo (Commands: Recursion: Options/Recursion): Document - special case of -j. - - * make.texinfo, main.c, job.c: Changed copyright notices to include - 1990. - - * make.texinfo (Top): Fixed introductory paragraph, which said that - `make' itself (instead of the manual) has various chapters. - (Variables: Advanced: Substitution Refs): When pxref'ing about - `patsubst', use node `Text Functions', not `Functions'. - Add an xref about `patsubst' after description of $(var:a%b=c%d). - (Functions: Syntax of Functions): Explain why mixing delimiters in - function/var refs is unwise. Clarify fn arg evaluation order. - (Options): Reworded sentence about `-e'. - (Implicit: Implicit Variables): Don't say `RM' is unused. - Say the dflt values for the flag vars is empty unless otherwise noted, - since some have defaults. - (Implicit: Pattern Rules: Pattern Examples): Clarified use of $< and $@ - in first example. - (Implicit: Last Resort): Don't say the .DEFAULT example creates files - "silently". It's automatic, but not silent. - (Implicit: Search Algorithm): Fixed confusing ungrammatical sentence - for item 5.1. - (Archives: Archive Update): Added missing `next' pointer. - (Archives: Archive Symbols): Note that GNU `ar' deals with this - automatically. - - * job.c (search_path): New fn, to search for an executable file in a - search path (broken out of exec_command). - (exec_command): Take fourth arg, the shell program to use (if - necessary). Use search_path for the program, and the shell program. - Pass args "file args ..." to shell program (with no -c), where FILE is - the full pathname of the program (script) to be run. - (child_execute_job): Pass shell program to exec_command. - * main.c (main): Ditto. - - * main.c (main): Don't write a message if exec_command returns, because - it will never return. - -Fri Dec 22 16:19:58 1989 Roland McGrath (mcgrath at hecuba.Berkeley.EDU) - - * default.c (default_variables: "LINK.cc"): Use $(C++FLAGS) instead of - $(CFLAGS). - -Wed Dec 20 09:58:48 1989 Roland McGrath (mcgrath at hecuba.Berkeley.EDU) - - * job.c (new_job): If start_job set the child's `command_state' to - `cs_finished', call notice_finished_file. - -Sun Dec 17 19:45:41 1989 Roland McGrath (mcgrath at hecuba.Berkeley.EDU) - - * Version 3.57.3. - -Wed Dec 13 17:57:12 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * rule.c (convert_to_pattern): Accept files with dependencies as - suffix rules. - -Thu Nov 30 15:47:13 1989 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * Version 3.57.2. - - * function.c (expand_function: `shell'): Don't clobber BUFFER and then - try to free it. - - * remake.c (update_file_1): Took code to force remake of nonexistent - deps out of #if 0, and changed the test to nonexistent non-intermediate - deps. In version 4, I think removing this test completely will - implement the new feature that if a: b and b: c and c is newer than a, - b need not be remade. - -Sun Nov 26 16:12:41 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * compatMakefile (load.o, remote.o): Use $*.c instead of explicit file - names so that using VPATH works. - -Tue Nov 21 14:57:18 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.57.1. - -Fri Nov 10 03:28:40 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * remake.c (check_dep): Set *MUST_MAKE_PTR if FILE does not exist after - being updated. (The exact opposite test was here before; why???) - (update_file_1): Set a dep's `changed' member after updating it if it - is phony and has commands (because they will then always be executed). - -Thu Nov 9 13:47:12 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * load.c [UMAX]: #ifdef UMAX_43 include different headers for the - `inq_stats' call. - * compatMakefile (LOAD_AVG): Document UMAX_43. - - * Version 3.57.0. - - * commands.c (chop_commands): New function to chop commands into lines. - * job.c (new_job): Break that code out, and call chop_commands. - * remake.c (remake_file): Call chop_commands before looking at - FILE->cmds->any_recurse. - - * make.texinfo (Running: Goals): Don't say that the default target - won't be taken from an included makefile. - - * remake.c (update_file_1): #if 0 out setting MUST_MAKE if a dep - doesn't exist. - -Fri Nov 3 15:53:03 1989 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * Version 3.57. - - * variable.c (try_variable_definition): Don't calculate useless value. - - * main.c (define_makeflags): Fixed -j propagation. - - * commands.c (execute_file_commands): Removed unused variable. - -Sun Oct 29 11:11:15 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * commands.c (execute_file_commands): If the commands are empty, call - notice_finished_file before returning. - -Sat Oct 28 23:06:32 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * remake.c (update_file_1): Don't always update a target that has no - deps. Only do this for double-colon targets. - -Wed Oct 25 16:36:16 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * main.c (main) [hpux]: hpux == HPUX. - * compatMakefile (defines): Document that HPUX should be defined. - -Tue Oct 24 19:19:48 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.56.8. - - * job.c (exec_command): Fixed what mode bits are checked. - - * remake.c (update_file_1): "No cmds and no deps actually changed" - loses if ! FILE->is_target. - - * make.texinfo (Variables: Setting): Don't say that spaces after a - variable definition are ignored (since they aren't). - -Mon Oct 23 14:34:23 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.56.7. - - * remake.c (update_file_1): If, after being updated, any dependency - does not exist, remake the target. - - * remake.c (update_file_1): Always update if FILE has commands but no - deps. - - * commands.c (execute_file_commands): If we return early because there - are no commands, set FILE->updated. - -Thu Oct 19 18:47:37 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * arscan.c (ar_scan) [M_XENIX]: Don't run atoi or atol on the - `struct ar_hdr' members that are int or long int on Xenix. - -Sat Oct 14 10:43:03 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * arscan.c (ar_scan): Cosmetic clean ups. - (ar_name_equal): New function to compare names, handling truncated - member names and special `.o' truncation. - (ar_member_pos): Use ar_name_equal. - * ar.c (ar_member_date_1): Use ar_name_equal. - - * Version 3.56.6. - - * file.h (struct file): Made `update_status' a `short int', and moved - it before `command_state' so the bitfields can be packed better. - - * remake.c (files_remade): Made global. - (notice_finished_file): Don't increment files_remade. - * job.c (new_job): Do. - - * job.c (start_job): Don't return a value. Always set - CHILD->file->command_state to either cs_running or cs_finished. - (new_job, child_handler): Don't expect start_job to return a value. - Instead, look at the file's command_state. - - * commands.c (chop_commands): Merged into job.c (new_job). - * commands.h: Don't declare chop_commands. - - * job.c (start_job): Made static. - (new_job): New function to create a `struct child' and call start_job. - (free_child): New function to free a `struct child'. - (child_handler, new_job): Call it. - * job.h: Don't declare start_job. Do declare new_job. - * commands.c (execute_file_commands): Call new_job. - - * commands.c (execute_file_commands): Don't set FILE->update_status if - start_job fails. - - * function.c (expand_function): Don't use `reading_filename' and - `reading_lineno_ptr' if they're nil. - -Fri Oct 13 18:16:00 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * read.c (find_semicolon): New function to look for an unquoted ; not - preceded by an unquoted # in a string. - (read_makefile): Call it before expanding the line. If it finds a ;, - cut the line short there before expanding it. If not, call it again - after expanding. - - * commands.c (execute_file_commands): Don't check FILE->command_state. - We won't get called unless it's cs_not_started. - - * read.c (read_makefile): Call collapse_line on the variable-expanded - rule line after checking for ; and #. - - * job.c (start_job): When there are no more commands, always return 0. - * commands.c (execute_file_commands): Don't put the new child in the - `children' chain unless FILE->command_state is cs_running. - - * read.c (read_makefile): Rewrote ;-handling to only do it once (why - did I do it twice??) and to check for a # before the ;. - - * job.c (start_job): Set CHILD->file->update_status to 0 when we run - out of commands. Set it to 1 before returning failure. - (child_handler): Don't set C->file->update_status to 0 when start_job - returns success and commands are not running. - - * read.c (read_makefile): If there is a # before the ; for commands, - forget the ; and commands. - -Thu Oct 12 15:48:16 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * job.c (child_execute_job): Pass -c to the shell. - -Wed Oct 11 18:41:10 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.56.5. - - * main.c (define_makeflags): Cleaned up to keep better track of dashes - written, etc. - - * function.c (expand_function: `shell'): When converting newlines to - spaces in output, search with `index' calls rather than a simple loop. - - * main.c (main): Make sure stdout is line-buffered. - - * main.c (decode_switches): Always check for missing switch arg. - -Mon Oct 9 17:17:23 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.56.4. - -Sat Oct 7 00:32:25 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * commands.c (set_file_variables): #ifdef NO_ARCHIVES, still set $@ and - $%. - - * commands.c (set_file_variables): Include a trailing slash in the - directory variables (@D, etc.). - - * job.c (child_handler): Call notice_finished_file after changing a - child's state to `cs_finished'. - * remake.c (update_file_1): Don't call notice_finished_file if - FILE->command_state == cs_finished. - -Wed Oct 4 16:09:33 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.56.3. - -Tue Oct 3 21:09:51 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * read.c (read_all_makefiles): When setting elements of MAKEFILES from - the contents of read_makefiles, make sure we're using the right - element. - - * dir.c, glob.c [USGr3 || DIRENT]: Don't define d_ino as d_fileno. - - * Version 3.56.2. - - * remake.c (update_file_1): Return zero after calling remake_file if - FILE->command_state != cs_finished. Test update_status thoroughly. - - * commands.c (execute_file_commands): Don't call notice_finished_file. - - * remake.c (remake_file): Return immediately after calling - execute_file_commands. - -Sat Sep 30 14:57:05 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.56.1 (alpha). - - * file.h (struct file): Made `update_status' not be a bitfield, since - some broken compilers don't handle it right. - - * function.c (expand_function: `join'): Don't clobber the pointers and - then try to free them. - - * job.c (exec_command): Fixed & vs = precedence problem. - -Thu Sep 28 17:29:56 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * remake.c (update_file_1): Fixed typo in debugging output. - - * remake.c (library_file_mtime): Search for /usr/local/lib/libLIB.a - after /usr/lib/libLIB.a. - -Tue Sep 26 16:07:58 1989 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * read.c (conditional_line): For `ifeq (a, b)', swallow space after the - comma. - -Sun Sep 24 13:25:32 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * function.c (patsubst_function): If BY_WORD and the match is not a - full word, update the text pointer correctly. - - * function.c (expand_function: `word'): Don't lose track of the second - arg's expansion and free something else instead. - -Fri Sep 22 16:15:29 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.56. - -Thu Sep 21 14:28:42 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * main.c (main): Make an array of the mtimes of the makefiles before - updating them, and compare their file_mtimes against this later. Don't - re-exec if a makefile was successfully updated but didn't change. If a - makefile failed to be remade and no longer exists, die. If a makefile - failed to be remade, but changed anyway, re-exec. If a makefile failed - to be remade, but is unchanged, continue on. - -Wed Sep 20 18:02:07 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.55.6. - - * implicit.c (pattern_search): Maintain an array CHECK_LASTSLASH of the - CHECK_LASTSLASH flag values used to match each member of TRYRULES. - When making FILE->stem, if CHECKED_LASTSLASH[FOUNDRULE], prepend the - part of FILENAME before LASTSLASH. - -Tue Sep 19 17:44:08 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * dir.c (dir_file_exists_p): Check for FILENAME being nil before - checking for it being "". - - * main.c (define_makeflags): Fixed test for whether a flag/flag_off - option was non-default. Also changed to generate a string that Unix - Make will grok (except for FP/int values and new flags). - - * job.c (child_execute_job): Don't use the shell's -c option. - Also fixed an off-by-one bug in the ARGV -> shell arg list copying. - -Mon Sep 18 15:17:31 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.55.5. - - * read.c (parse_file_seq): Check the beginning of the file name for a - `./', not the two chars after the end of the name (Q rather than P). - - * job.c (child_execute_job): Include all of ARGV in the arg list for - the shell. - - * main.c (define_makeflags): Don't include floating and positive_int - options in !PF. - - * job.c (exec_command): Set the effective gid to the real gid before - execing. - - * job.c (child_execute_job): Don't clobber the arg list when execing - the shell. - -Sun Sep 17 15:27:19 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * main.c (define_makeflags): Moved all the checking inside the switch. - - * load.c [LDAV_BASED] (load_average): When we can't get the load - average, return zero instead of running off the end. - - * file.c: Include variables.h. - * job.c: Declare dup2 and {block,unblock}_remote_children. - * file.h: Declare f_mtime. - * job.c: Don't declare construct_command_argv, since job.h does. - * function.c, main.c, load.c, remake.c: Include job.h. - * load.c [LDAV_BASED] (load_average): Declare nlist. - * variable.h: Declare print_file_variables. - * job.c [!USG]: Don't declare sigsetmask. - [!USG]: Declare getdtablesize. - Don't declare load_average. Do declare wait_to_start_job. - Declare vfork, gete[gu]id, execve. - * commands.c: Declare remote_kill, getpid. - * make.h: Declare kill, exit, sigblock, pipe, close, ctime, open, - lseek, read. - * make.h [not USG]: Declare sigsetmask. - * job.h: Declare wait_for_children and {block,unblock}_children. - - * dir.c (dir_file_exists_p): If FILENAME is nil, read in the whole - directory. - (find_directory): When we want to read in the whole directory, call - dir_file_exists_p with nil instead of "". - - * file.h (struct file), job.h (struct child), - variable.h (struct variable): Use bitfields for flags. - * make.h (ENUM_BITFIELD): If GCC or #ifdef ENUM_BITFIELDS, define as - :BITS, else empty. - * compatMakefile (defines): Document ENUM_BITFIELDS. - -Sat Sep 16 12:38:58 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.55.4 (alpha). - - * GNUmakefile (dist): Depend on default and doc. - - * load.c [LDAV_BASED]: Include rather than ; #ifdef - NLIST_NAME_UNION, use n_un.n_name instead of n_name. - * compatMakefile (LOAD_AVG): Document NLIST_NAME_UNION. - - * job.c [USG-ish]: Don't redefine WIF{SIGNALED,EXITED} if they're - already defined. - -Fri Sep 15 13:59:42 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * glob.c, dir.c [USGr3 or DIRENT]: If neither d_ino, nor d_fileno is - defined, define d_ino as d_fileno. - -Thu Sep 14 18:29:38 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * job.c: Don't declare exec_command static. - - * make.texinfo (Name Index): Changed title to include directives. - - * Version 3.55.3 (alpha). - - * make.texinfo (Running: Options): Document -e. - - * main.c (main): Always give imported environment variables origin - `o_env'. - * variable.c (define_variable_in_set): Under -e, if ORIGIN, or an - existing variable's origin, is `o_env', make it `o_env_override'. - - * load.c: Use the symbol KERNEL_FILE_NAME instead of KERNEL_FILE. - * compatMakefile: Changed the comment for `LOAD_AVG' accordinly. - -Thu Sep 7 16:46:26 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.55.2 (alpha). - - * variable.c (print_variable_set), rule.c (print_rule_data_base), - file.c (print_file_data_base): If NO_FLOAT is defined, don't use - floating-point for printing statistics. - * compatMakefile (defines): Document NO_FLOAT. - - * make.h (HASH): New macro to add the hashing value of one char to a - variable.c. - * file.c (lookup_file, enter_file, rename_file): Use it. - * dir.c (find_directory, dir_file_exists_p, file_impossible_p): Ditto. - * variable.c (define_variable_in_set, lookup_variable): Same here. - - * variable.c, file.c, dir.c: Don't define *_BUCKETS if they are already - defined. - - * compatMakefile (defines): Added comment about defining NO_ARCHIVES. - (ARCHIVES, ARCHIVES_SRC): New variables for {ar,arscan}.[oc]. - (objs, srcs): Use $(ARCHIVES) and $(ARCHIVES_SRC). - * commands.c (set_file_variables), dir.c (file_exists_p), - remake.c (touch_file, name_mtime), implicit.c (try_implicit_rule, - pattern_search), make.h: If NO_ARCHIVES is #defined, don't do any - archive stuff. - - * commands.c (set_file_variables): Don't kill the last char of - directory names in $([@*<%?^]D). - -Wed Sep 6 15:23:11 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * default.c (default_terminal_rules {%:: %,v}, {%:: RCS/%,v}): Don't - run co if the target exists. - - * glob.c (glob_match): [!xyz], rather than [^xyz], means none of [xyz]. - - * glob.c: Misc minor cosmetic changes. - -Tue Sep 5 14:49:56 1989 Roland McGrath (mcgrath at saffron.Berkeley.EDU) - - * load.c [LDAV_BASED] (load_average): Check for == -1, rather than < 0 - to see if lseek fails. On some systems, `avenrun' is at an offset > - (2**31)-1, and lseek succeeds, returning a negative value. - -Mon Sep 4 11:07:58 1989 Roland McGrath (mcgrath at saffron.Berkeley.EDU) - - * rule.c (new_pattern_rule): Return `int' instead of `void': nonzero if - the passed rule was used, zero if not. - (install_pattern_rule): Pay attention to the return from - new_pattern_rule, and don't set the rule's `terminal' flag or give it - commands unless it's used. - (create_pattern_rule): Same idea. - - * dir.c (find_directory): Removed unused variable. - - * commands.c (execute_file_commands): Removed unused variable. - - * read.c (record_files): Don't use NAME after freeing it. - -Sat Sep 2 00:33:19 1989 Roland McGrath (mcgrath at saffron.Berkeley.EDU) - - * Version 3.55.1 (alpha). - - * function.c (string_glob): Don't add spaces after file names that - aren't added. (Also means don't add spaces without checking the size - of the buffer.) - - * remake.c (update_goal_chain): Don't remove makefiles with cmds and no - deps from the chain. - * main.c (main): Do it here, before calling update_goal_chain. - - * remake.c (update_goal_chain): When updating fails, change STATUS even - if MAKEFILES is set. Also stop remaking when updating fails if not - under -k and MAKEFILES is not set. - - * remake.c (remake_file, update_file_1, notice_finished_file), - commands.c (execute_file_commands), make.h, commands.h: The functions - remake_file, notice_finished_file, and execute_file_commands no longer - return values, and their callers no longer expect values returned. - - * remake.c (notice_finished_file): Don't set FILE's modtime to now if - it is a non-target with no commands. - -Fri Sep 1 00:04:39 1989 Roland McGrath (mcgrath at saffron.Berkeley.EDU) - - * read.c (read_all_makefiles): After freeing each element on MAKEFILES, - replace it with the name stored in read_makefiles by read_makefile. - - * remake.c (update_file_1): Don't decide not to remake if FILE has no - cmds and no deps actually changed if FILE doesn't have any deps. - - * file.c (remove_intermediate): Remove precious files that also have - the `dontcare' flag set. - - * remake.c (update_file_1): Don't always remake if FILE has cmds but no - deps; only if FILE is double-colon. (I don't know why this should be - done for double-colon targets, but that's what Unix make does.) - - * load.c [LDAV_BASED] (load_average): Write error messages if the - various system calls fail. Keep track of if we've failed before. - The first time we fail, write a message saying -l won't be enforced. - The first time we succeed after having failed, write a message saying - -l will be enforced again. - - * remake.c [USG]: Don't #include - - * load.c [generic Unix LDAV_BASED]: #include #ifdef USG, - else instead. - - * job.c [USG && !USGr3 && !HAVE_DUP2]: Remove redundant - #include and declaration of `errno'. - [...] (dup2): Fixed so it won't always lose. - - * default.c (default_suffix_rules: .texinfo.dvi): Copy, rather than - move, the aux and index files, so the TeX run can use them. - - * compatMakefile: Remove redundant comment. - - * load.c [generic Unix LDAV_BASED]: Include instead of - , since the `struct nlist' declaration in varies - more than the one in . - (load_average): Use the `n_un.n_name' field of the `struct nlist', - since the declaration uses the union. - - * main.c (main): For the temporary files made for stdin makefiles, set - the `intermediate' and `dontcare' flags. - * file.c (remove_intermediates): Don't print any messages for files - whose `dontcare' flag is set. (The only files that will be - intermediate and `dontcare' will be the temporary files made for stdin - makefiles.) - - * job.c (exec_command): Made global. - * job.h: Declare it. - * main.c (main): Use exec_command when re-execing. - - * make.h: Declare environ. - * make.c: Don't. - - * job.c (child_execute_job): New function to perform everything done in - the child side of a fork (for a job or `shell' function). - (start_job): Call it. - * job.h: Declare construct_command_argv and child_execute_job. - * function.c (expand_function: `shell'): Use child_execute_job. - -Thu Aug 31 18:42:51 1989 Roland McGrath (mcgrath at saffron.Berkeley.EDU) - - * function.c (expand_function: `shell'): Remove a trailing newline - instead of turning it into a space. - - * main.c (main): Do init_siglist #ifdef HAVE_SIGLIST. - - * job.c [WTERMSIG || (USG && !HAVE_SYS_WAIT)]: Test each W* macro - separately and define all those that aren't defined. - -Sat Aug 26 15:13:21 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * ar.c (ar_name): Return zero for `(foo)'. - - * Version 3.55. - - * make.texinfo (Rules: Multiple Targets): Make this node's `next' - pointer point to `Static Pattern'. - * make.texinfo (Makefiles: MAKEFILES Variable): Make this node's `prev' - pointer point to `Makefile Names'. - - * make.1: Renamed to make.man. - * compatMakefile: Define `mandir' and `manext'. - (install): Depend on $(mandir)/make.$(manext). - ($(mandir)/make.$(manext)): Depend on make.man and copy it to $@. - ($(bindir)/make): Use `make' rather than $<; so Unix make can grok it. - -Thu Aug 24 03:35:48 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * variable.c (target_environment): Allow variables that start with - underscores. - -Wed Aug 23 22:50:32 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * variable.c (target_environment): Reject variables that don't start - with letters. - -Tue Aug 22 04:14:29 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * GNUmakefile (make-$(version).tar.Z): Put make.1 (the Unix manual - page) in the tar file. - - * variable.c (target_environment): Don't write variables with origin - o_default (i.e., ones from default.c). - * make.texinfo (Commands: Recursion: Variables/Recursion): Document - that default variables are not put in the environment. - - * remake.c (update_file_1): Remake all targets with commands but no - deps. - -Sat Aug 19 06:03:16 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * remake.c (update_file_1): In the final loop, set the deps' - `changed' members if they are newer than FILE. - - * remake.c (update_goal_chain): Under -d, print a message if we decide - not to remake a makefile so as to avoid a possible infinite loop. - -Fri Aug 18 20:30:14 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * remake.c (remake_file): Cleaned up. - - * commands.c (execute_file_commands): If the commands are empty, set - FILE->update_status to zero before returning. - - * remake.c (notice_finished_file): Set `last_mtime' fields to zero - instead of calling name_mtime; file_mtime will do that later if anybody - cares. - -Thu Aug 17 10:01:11 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * make.texinfo (Rules: Wildcards: Wildcard Examples): Give this node a - `prev' pointer. - - * Version 3.54.9 (alpha). - - * make.texinfo: Fixed some @nodes. - - * remake.c (check_dep): Don't set *MUST_MAKE_PTR if FILE doesn't exist - after running update_file. - - * remake.c (notice_finished_file): If FILE has no commands, pretend its - modtime is now. - - * remake.c (update_file_1): In the loops that call update_file on the - deps, compare modtimes before and after (unless deps are still being - made) and set the deps' `changed' members. Do not set the `changed' - members in the loop that prints the newer/older debugging messages. - * remake.c (update_file_1): If no deps changed and FILE has no - commands, decide it doesn't need remaking. - - * remake.c (update_file_1): Print a debugging message if we take - commands from default_file. - - * make.texinfo (Rules: Directory Search: Selective Search): Removed - note about warning for `vpath' with a constant pathname, since it isn't - warned about anymore. - - * remake.c (update_goal_chain): If MAKEFILES, remove makefiles which - are targets and have no deps. - * make.texinfo (Makefiles: Remaking Makefiles): Document that makefiles - will not be remade if they are targets but have no dependencies. - -Tue Aug 15 00:00:08 1989 Roland McGrath (roland at apple-gunkies.ai.mit.edu) - - * remake.c (notice_finished_file): Increment files_remade for non-phony - files if they didn't exist before (even if they still don't). - - * job.c: Include and declare errno. - - * job.c (exec_command): If the execve fails with ENOEXEC (Exec format - error), return instead of exiting the child process. - - * job.c (start_job): In the child side, if exec_command fails, try - using the shell. - - * job.c (start_job): In the child side, call unblock_children instead - of sigsetmask. - - * remake.c (notice_finished_file): Under -n or -q, always increment - files_remade for non-phony files. - - * rule.c (intall_pattern_rule): Use find_percent. - - * vpath.c (vpath_search): Pass the `percent' members to - pattern_matches. - -Mon Aug 14 23:30:24 1989 Roland McGrath (roland at apple-gunkies.ai.mit.edu) - - * vpath.c (struct vpath): New member `percent', to hold a pointer into - the pattern where the % is. - (construct_vpath_list): Call find_percent on the pattern and set the - new `percent' member. - * read.c (read_makefile): Don't run find_percent on `vpath' directive - patterns. - - * function.c (pattern_matches): Take new arg PERCENT, a pointer into - PATTERN where the % is. If PERCENT is nil, copy PATTERN into local - space and run find_percent on it. - (expand_function: `filter', `filter-out'): Pass new arg to - pattern_matches. - * read.c (record_files): Pass PATTERN_PERCENT to pattern_matches for - static pattern rules. Save the percent pointer into implicit rule - targets, and pass them to create_pattern_rule. - * rule.c (convert_to_pattern): Pass new arg to create_pattern_rule. - (create_pattern_rule): Take new arg TARGET_PERCENTS, nil or an array of - pointers into the corresponding elements of TARGETS, where the %s are. - -Sun Aug 13 00:29:19 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * Version 3.54.8. - - * README.templatate, README-doc.template: New files, turned into README - and README-doc to go into the two distribution tar files. - * GNUmakefile: Added a rule to edit the version number in - README.template and README-doc.template, producing README and - README-doc. - - * remake.c (update_goal_chain): If -n or -q is in effect for a - makefile, and it got updated, don't change STATUS, so we can still - return -1 (meaning nothing was done). This avoids an infinite loop on - "make -n Makefile". - -Sat Aug 12 23:14:24 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * remake.c (notice_finished_file): Treat -q the same as -n. - - * remake.c (update_goal_chain): Fixed handling of return from - update_file. If -n or -q is in effect, ignore it. - - * job.c (start_job): Don't test for -t. We should never get called in - that case. - -Fri Aug 11 04:09:14 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * function.c (expand_function): Removed unused variables. - (handle_function): Removed unused variable. - - * main.c (main): Removed unused variable. - -Wed Aug 9 09:37:10 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * Version 3.54.7. - - * remake.c (notice_finished_file): If FILE's modtime actually changed, - increment files_remade. - (remake_file): Don't increment files_remade. - - * remake.c (update_file): Don't print "up to date" messages for - phony files. - - * job.c (child_handler): Don't set C->file->update_status to 1 if - start_job returns nonzero under -n or -t. - - * expand.c (variable_expand): Count parens in $(foo:a=b) refs. - - * main.c: Removed old declaration of `glob_tilde' (which hasn't existed - for a few months). - -Tue Aug 8 23:53:43 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * job.c (exec_command): Fixed to not ignore the last path component and - to do the right thing with an empty path. - -Fri Aug 4 15:58:19 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * remake.c (library_file_mtime): Look for libLIB.a, not /libLIB.a. - Do VPATH search on libLIB.a, not /usr/lib/libLIB.a - -Thu Aug 3 20:42:00 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * job.c [HAVE_SYS_WAIT or not USG]: If WIFSIGNALED is not defined by - , define it as (WTERMSIG != 0). - -Tue Aug 1 19:25:34 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * remake.c (remake_file): If FILE has no commands and is a target, - don't set its time to now. The time gets reset by notice_finished_file - anyway, and it isn't needed since check_dep checks for nonexistence. - - * Version 3.54.6. - - * read.c (read_makefile): Don't read off the end of the string after an - `include'. - - * job.c (exec_command): New function to search the path for a file and - execute it. - (start_job): Use exec_command rather than execvp. - - * read.c (read_makefile): Expand `include' directive args before - parsing them. Allow trailing whitespace after filename. - - * variable.c (target_environment): Put makelevel + 1, rather than - makelevel, in the `MAKELEVEL' envariable. - -Sat Jul 29 10:27:04 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * remake.c (notice_finished_file): Don't get the new modtime of phony - files. - - * remake.c (remake_file): Run commands instead of touching under -t if - FILE->cmds->any_recurse is set. - - * commands.h (struct commands): Add new member `any_recurse', to be set - nonzero if any `lines_recurse' element is nonzero. - * commands.c (chop_commands): Set the `any_recurse' member. - - * commands.c (execute_file_commands): Split chopping of commands into - lines into new function chop_commands. - * commands.h: Declare chop_commands. - - * read.c (read_makefile): Test for a line beginning with a tab after - checking for conditional lines, but before all other checks. - -Fri Jul 28 18:10:29 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * read.c (read_makefile): Match directives against collapsed line - and use that for their args. - - * read.c (read_makefile): Warn about extra text after `include'. - -Tue Jul 25 14:34:25 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * make.texinfo (Rules: Directory Search: Selective Search): Fixed - example to use correct `vpath' syntax. - -Mon Jul 24 12:10:58 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * Version 3.54.5. - - * job.c (start_job): In the child side, unblock SIGCHLD. - -Fri Jul 21 18:25:59 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * make.h: Don't include #ifdef sun. - -Mon Jul 17 14:29:10 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * implicit.c (pattern_search): If ar_name (FILENAME), don't check for - directory names. - - * job.c (wait_for_children): Changed "waiting for children" message to - "waiting for unfinished jobs". - -Fri Jul 14 13:17:13 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * load.c (load_average): Use an unsigned offset into kmem. - -Thu Jul 13 18:44:49 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * variable.c (pop_variable_scope): Don't free the head of the chain of - variables in each bucket twice. - -Tue Jul 11 06:45:24 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * GNUmakefile: Include COPYING in the doc tar file. - - * variable.c, read.c, misc.c, job.c, function.c: Replace some identical - "for" loops with next_token or end_of_token calls. - -Mon Jul 10 16:55:08 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * Version 3.54.4. - - * compatMakefile: Documented new conditionals. - - * job.c: Don't define sys_siglist if HAVE_SIGLIST is defined. - Don't define dup2 if HAVE_DUP2 is defined. - - * job.c (child_handler): Interpret the return from start_job correctly. - - * remake.c (update_file_1): Don't write "target not remade because of - errors" message under -n or -q. - - * read.c: Declare getpwnam. - - * glob.c: Use if DIRENT is defined. - [USG]: Don't declare memcpy, since does. - -Fri Jul 7 20:53:13 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * misc.c (collapse_line): Copy the line over in the right place. - -Fri Jul 7 18:33:24 1989 Roland McGrath (fsf at void.ai.mit.edu) - - * remake.c: Conditionalize inclusion of on not - USG, since HP-UX defines a `struct file' there. - -Fri Jul 7 12:11:30 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * job.c: If WTERMSIG is defined by , define WAIT_T as int, - and don't define other macros; this covers HP-UX. - If WTERMSIG is not defined, use int or union wait based on USG and - HAVE_SYS_WAIT; this covers BSD and SysV. - - * Version 3.54.3 (alpha). - - * job.c [USG and not USGr3]: Include and declare errno. - - * job.c (unblock_children [USG]): Declare child_handler. - - * job.c: Renamed WRETCODE to WEXITSTATUS. - [HAVE_SYS_WAIT or not USG]: Undefine WTERMSIG, WCOREDUMP, and - WEXITSTATUS before defining them. The HP-UX defines them. - - * main.c (main): If there are no goals, fatal AFTER printing the data - base under -p. - -Thu Jul 6 22:43:33 1989 Roland McGrath (roland at apple-gunkies.ai.mit.edu) - - * glob.c [USG]: #define rindex as strrchr. - - * job.c [USG]: Include and #define getdtablesize() as - NOFILE. - -Wed Jul 5 09:36:00 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * Version 3.54.2 (alpha). - - * expand.c (variable_expand): When expanding recursive variable - references (${${a}}), use the correct delimiters in the constructed - variable reference. - -Mon Jul 3 18:29:26 1989 Roland McGrath (roland at apple-gunkies.ai.mit.edu) - - * compatMakefile: Clear out and redefine the .SUFFIXES list because - silly Sun 4 make defines .cps.h. - - * compatMakefile: Fix comment about -DNO_MINUS_C_MINUS_O. - - * remake.c: Include for O_* on 4.2. - - * commands.c: Define sigmask if it's not defined. - -Fri Jun 30 07:33:08 1989 Roland McGrath (roland at apple-gunkies.ai.mit.edu) - - * remake.c (remake_file): Don't always increment files_remade. - - * variable.c (push_new_variable_scope): Zero the new variable hash - table. - -Thu Jun 29 17:14:32 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * expand.c (variable_expand): When terminating the variable expansion - buffer, use variable_buffer_output instead of a simply zero store, - because the buffer may need to be enlarged. - -Wed Jun 28 16:53:47 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * Version 3.54. - - * default.c (default_suffixes): Added `.ln'. - (default_suffix_rules): Changed lint rules to use -C. - -Thu Jun 22 20:49:35 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * job.c (start_job): Set `environ' to CHILD->environment before execing - in the child process! - -Tue Jun 20 17:23:13 1989 Roland McGrath (roland at spiff.ai.mit.edu) - - * compatMakefile: Put job.h and rule.h in `srcs'. - - * Version 3.53. - -Mon Jun 19 16:25:18 1989 Roland McGrath (roland at spiff.ai.mit.edu) - - * job.c (start_job): If there are no more commands, return nonzero - under -n or -t. - - * compatMakefile (make): Pass `-f' to mv. - - * GNUmakefile: If `ARCH' or `machine' is defined, make $(ARCH)/*.o and - $(ARCH)/make instead of *.o and make. - - * function.c (string_glob): Don't try to use freed storage! - - * read.c (readline): If there is only one byte of space in the buffer, - enlarge the buffer before reading more. - - * arscan.c [M_XENIX]: Miscellaneous minor changes for Xenix. - -Sun Jun 18 13:07:45 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * GNUmakefile (depend): Split commands into two lines so they won't be - so long when variable-expanded. - - * compatMakefile: Documented MINUS_C_MINUS_O meaning. The line - describing it got removed when the USG/wait stuff was documented. - -Sat Jun 17 22:56:54 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * Version 3.52. - -Mon Jun 12 17:45:11 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * remake.c (check_dep): Drop circular dependencies instead of fataling. - (update_file_1 already does this.) - - * default.c (default_suffix_rules): For .s -> .o, put the -o flag to - the assembler before the source file name. - -Sun Jun 11 12:00:52 1989 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * Version 3.51. - - * make.texinfo (Features): Noted 1003.2 requirement of `+' meaning. - - * file.c (remove_intermediates): If !SIG, write a single "rm" command - line, listing all files. - - * read.c (read_makefile): Don't free the storage for the passed - filename, since it might not be malloc'd. When doing an included - makefile, free the name's storage. - (read_all_makefiles): Use variable_expand to find the value of - `MAKEFILES'. Free the storage for the names of -f makefiles. - (read_makefile): Allocate storage for the makefile name in the - `struct file' in read_makefiles. - - * make.texinfo (Running: Instead of Execution): Document the effect of - + and $(MAKE)/${MAKE}. - - * make.texinfo (Functions: Foreach Function): Document that if the - iteration variable was undefined before the `foreach' call, it will be - undefined after the call. - - * commands.c: Split into commands.c, job.h, and job.c. - - * rule.c (try_implicit_rule, pattern_search): Moved to new file - implicit.c. - - * rule.c: Split into rule.h, rule.c, and default.c. - * default.c (install_default_pattern_rules): Renamed to - install_default_implicit_rules. - * make.h, main.c (main): Renamed uses. - - * make.c: Renamed to misc.c. - - * make.c (main, log_working_directory, decode_switches, - decode_env_switches, define_makeflags, die, print_version, - print_data_base): Moved to new file main.c. - - * commands.c (execute_file_commands): Don't collapse backslash-newlines - here. When chopping the commands up into lines, don't chop at - backslash-newlines. - (start_job): Collapse backslash-newlines after printing the line. - - * commands.c (start_job): Don't collapse backslash-newlines here. - (execute_file_commands): Collapse backslash-newlines before chopping - the commands up into lines. - - * commands.c (set_file_variables): Initialize the length counters for - $^ and $? to zero! - - * commands.c (start_job): Use vfork instead of fork. Someone else says - the child and parent DO have separate file descriptors. - - * variable.c: Split internals into variable.c, function expansion into - function.c, and variable expansion into expand.c. - * function.c (handle_function): New function to check for a function - invocation and expand it. - * expand.c (variable_expand): Use handle_function. - * variable.c (push_new_variable_scope): New function to push a new - empty variable set onto the current setlist. - (pop_variable_scope): New function to pop the topmost set from the - current setlist and free its storage. - * function.c (expand_function: `foreach'): Push a new variable scope - for the iteration variable and pop the scope when finished. - * variable.h: Declare new functions. - * variable.c (initialize_variable_output): New function to return a - pointer to the beginning of the output buffer. - (save_variable_output): New function to save the variable output state. - (restore_variable_output): New function to restore it. - * expand.c (variable_expand): Use initialize_variable_output. - (allocated_variable_expand): Use {save,restore}_variable_output. - * variable.c (current_setlist): Renamed to current_variable_set_list - and made global. - -Sat Jun 10 00:11:25 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * remake.c (library_file_mtime): Check for libNAME.a in the current - directory before doing VPATH search. - - * variable.c (print_variable_set): Don't write "# Variables", and write - fewer blank lines. - (print_variable_data_base): Precede the variables with "# Variables". - - * make.c (main): Print the data base under -p after doing everything - else, just before exitting. This way it gets info determined in - updating the goal targets. - - * variable.c (print_variable_data_base): Split into print_variable, - which prints one variable, and print_variable_set, which prints a set. - Replaced with a call to print_variable_set for the global set. - (print_file_variables): New function to print a given file's local - variables. - - * file.c (print_file_data_base): Call print_file_variables to print - each file's local variables. - - * commands.c (set_file_variables): Actually define the values for - the $^ and $? variables!!! - - * make.texinfo (Implicit: Pattern Rules: Automatic): Document new D and - F versions of $^ and $?. - - * commands.c (start_job): In the child fork, use getdtablesize and a - loop to close all file descriptors other than 0, 1, and 2. We need to - do this since not only the bad stdin pipe, but also some directories, - may be open. - - * commands.c (start_job): Use fork instead of vfork, because a vfork - parent and child share file descriptors, and our child needs to diddle - with stdin. - - * variable.c (initialize_file_variables): When created a new variable - set, zero out the hash table. - - * variable.c (target_environment): Don't use variables whose names are - not made up of alphanumerics and underscores. - - * remake.c (update_file_1): Set the `parent' member of each dependency - to FILE before updating it. - - * file.h (struct file): Add `parent' member. - - * variable.c (initialize_file_variables): Don't take second arg PARENT. - Use FILE->parent instead. If FILE->parent->variables is nil, recurse - to initialize it. - - * variable.h: Declare {allocated_}variable_expand_for_file. - - * variable.c (allocated_variable_expand): Now - allocated_variable_expand_for_file, calling variable_expand_for_file, - and taking second arg FILE. - (allocated_variable_expand): New function, a wrapper around - allocated_variable_expand_for_file, passing a nil second arg. - -Fri Jun 9 12:11:45 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * commands.c (start_job): On the child side of the fork, always close - the bad stdin file descriptor. - - * commands.c (struct child): New member `environment', to hold the - environment for the child. - (execute_file_commands): Set the new childs `environment' member to nil - before calling start_job. - (start_job): Set up CHILD->environment before running the commands if - it is nil. - - * make.c (main): Don't call new_environ. `shell' functions will now be - run with the environment make was called with. - - * commands.c (child_handler): Don't check C->command_ptr before calling - start_job since we now have to check C->file->cmds->command_lines and - it's easier to let start_job handle all that. - - * commands.c (struct child): New member `command_line', to hold an - index into file->cmds->command_lines. - (execute_file_commands): Set the new child's `command_line' to 0 and - its `commands' and `commands_ptr' to nil. - (start_job): When CHILD->command_ptr runs out, increment - CHILD->command_line and run the corresponding line from - CHILD->file->cmds->command_lines. Run it even under -t, -q, or -n if - the CHILD->file->cmds->lines_recurse element for that line is set. - - * commands.c (execute_file_commands): Chop CMDS up into lines, setting - its `command_lines' and `lines_recurse' members, if it wasn't already - chopped. - - * commands.h (struct commands): New members `command_lines' and - `lines_recurse'. The first is an array of chopped-up lines; the second - is an array of flags, each nonzero if the corresponding line is - recursive. - - * variable.c (variable_expand_for_file): If FILE is nil, just do a - vanilla variable_expand. - (expand_function: `shell'): Pass second arg (as nil) to - construct_command_argv. - - * commands.c (construct_command_argv): Use variable_expand_for_file on - `$(SHELL)' and `$(IFS)' instead of lookup_variable to check those - variables. This handles file-local and recursive values correctly. - To support this, take an additional argument FILE. - - * variable.c (initialize_file_variables): New function to initialize - FILE's variable set list from PARENT's setlist. PARENT is the - immediate dependent that caused FILE to be remade, or nil if FILE is a - goal. (When user-level per-file variables are implemented, PARENT - should be passed as nil when defining per-file variables.) - - * variable.c (variable_expand_for_file): New function to expand a line - using the variable set of a given file, and reporting error messages - for the file and line number of that file's commands. - - * variable.h: Don't declare lookup_variable_for_file. - - * variable.c (lookup_variable_*): Turned back into lookup_variable. It - now uses current_setlist. - (global_setlist): New static `struct variable_set_list', a setlist - containing global_variable_set. - (current_setlist): New static `struct variable_set_list *', a pointer - to the current variable set list. - (define_variable): Define in the current top-level set, not the global - set. - - * commands.c (set_file_variables): New function to set up the automatic - variables for a file in its own variable set. - (execute_file_commands): Use set_file_variables. - - * variable.c (new_environ): Replaced with target_environment, taking an - argument FILE, and returning an environment for FILE's commands. - - * variable.c, variable.h: Remove all global special variable pointers. - - * variable.c (define_variable_for_file): New function like - define_variable, but takes additional arg FILE, and defines the - variable in the variable set at the top of FILE's chain. - (lookup_variable_for_file): New function like lookup_variable, but - takes additional arg FILE, and looks the variable up in all of FILE's - variable sets. - - * file.h (struct file): New member `variables', a `struct - variable_set_list' containing the list of variable sets used in the - expansion of the file's commands. - - * variable.c (variables): Replaced with static `struct variable_set' - global_variable_set. - (define_variable): Now define_variable_in_set, taking additional - argument SET, the `struct variable_set' to define it in. - (define_variable): Use define_variable_in_set with global_variable_set. - (lookup_variable): Now lookup_variable_in_set, taking additional - argument SET, the `struct variable_set' to look it up in. - (lookup_variable): Use lookup_variable_in_set with global_variable_set. - (lookup_variable_in_setlist): New function to look up a variable in a - `struct variable_set_list' using lookup_variable_in_set. - - * variable.h (struct variable_set): New structure, containing a hash - table and the number of hash buckets. - (struct variable_set_list): New structure, containing a link for a - linked-list, and a `struct variable_set'. - - * commands.c (start_job): Under -n, return what the recursive start_job - call returns, since it might actually start a child. - - * make.texinfo (Rules: Wildcards): Document ~ and ~USER expansion. - - * commands.c (execute_file_commands): If start_job returns - failure, but -t is set, set FILE->update_status to success. - (start_job): If -t is set, and the commands are not recursive, return - failure (is is done for -q). - - * remake.c (touch_file): New function to touch FILE. - (remake_file): Use touch_file. When touching a file, still do - execute_file_commands. - - * remake.c (remake_file): Don't check question_flag (-q), since we - can't know here if the commands are recursive. - - * commands.c (start_job): Don't use the `recursive' member of - CHILD->file->cmds. Instead, check for leading +s and $(MAKE) or - ${MAKE} in the command line here. - - * commands.h (struct commands): Remove `recursive' member. - - * rule.c (install_default_pattern_rules): Remove use of `recursive' - member. - - * read.c (record_files): Don't check commands from $(MAKE) and set - their `recursive' member. - - * commands.c (fatal_error_signal): Treat SIGQUIT like SIGINT, SIGHUP, - and SIGTERM, but don't send it to ourselves because it will cause a - core dump. - -Thu Jun 8 20:30:04 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.50. - - * variable.c (variable_expand): Use allocated_variable_expand instead - of expand_argument in a few places. - - * variable.c (allocated_variable_expand): Do static variable shuffling - here instead of using expand_argument. - (expand_argument): Use allocated_variable_expand. - - * variable.c (recursively_expand): New function to recursively expand - its argument (a `struct variable'), returning the malloc'd value. - (variable_expand): Use recursively_expand. - -Sun May 28 12:49:27 1989 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * make.c (main): Fixed buggy fix in deciding to increase space for - command-line variable definitions. (First it never did it, then it - always did it; now it does it when necessary.) - -Sat May 27 14:01:54 1989 Roland McGrath (mcgrath at hecuba.Berkeley.EDU) - - * make.c (main): Fixed bug in deciding to increase space for - command-line variable definitions. - -Fri May 26 15:48:01 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * read.c (multi_glob): Use allocated_expand_variable for checking - `HOME' variable for ~ expansion, since this may be called from inside a - `wildcard' function expansion. - - * variable.h: Declare allocated_expand_variable. - - * variable.c (allocated_expand_variable): New function to do variable - expansion in an allocated buffer, rather than the static one. - - * make.c (main): Don't set glob_tilde (it no longer exists). - - * variable.c (string_glob): Use multi_glob and parse_file_seq. - - * read.c (multi_glob): Do ~ expansion here. - - * glob.c (glob_tilde, glob_filename): Removed ~ expansion. - - * variable.c (define_variable, lookup_variable): Use a smarter hashing - algorithm (the same one used for files and directories). - (VARIABLE_BUCKETS): Increased to 523. - - * file.c (enter_file, lookup_file, rename_file): Use a smarter hashing - algorithm, spreading the bits about somewhat. - - * make.c (log_working_directory): Under `-p', precede the directory - message with a `#'. - - * make.c (print_version): Under `-p', precede each line with a `#'. - (print_data_base): Precede the header line with a `#' and include the - date and time on it. - - * vpath.c (print_vpath_data_base): Precede non-directive - lines with `#'s. - - * commands.c (print_commands): Precede the non-command line with a `#'. - - * rule.c (print_rule_data_base), file.c (print_file_data_base): Precede - non-rule lines with `#'s. - - * dir.c (print_dir_data_base): Precede all lines with `#'s. - - * variable.c (print_variable_data_base): Changed format so that it can - be makefile input. Lines that are not variable definitions are - preceded with `#'. Nonrecursive variable definitions are made with all - dollar signs doubled to reproduce the initial value. Recursive - variable definitions containing newlines are done with `define' - directives. Nonrecursive variable definitions containing newlines, and - variable names containing :, =, or newlines, will come out garbled. - -Wed May 24 00:20:04 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.49. - -Tue May 23 19:18:00 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * variable.c (expand_function: `filter'/`filter-out'): Use - find_percent instead of pattern_p. - - * variable.c (expand_function: `patsubst'): Pass new args (both nil) - to patsubst_expand. - (variable_expand): For $(var:pat%=rep%) references, pass new args to - patsubst_expand so as to avoid find_percent and thus disallow - quoting the %s. - - * read.c (record_files): Pass new args to patsubst_expand. - - * variable.c (patsubst_expand): Take two new args: PATTERN_PERCENT - and REPLACE_PERCENT. Each of these, if non-nil, means that PATTERN - (or REPLACE) has already been run through find_percent, and - PATTERN_PERCENT (or REPLACE_PERCENT) is the result. - - * make.h: Declare find_percent instead of pattern_p. - - * read.c (pattern_p): Changed to find_percent, returning a pointer - to the %, or nil if there is none. - (record_files): Take another arg, PATTERN_PERCENT, a pointer to the - % in PATTERN. - (read_makefile): Pass PATTERN_PERCENT to record_files. - - * make.texinfo (Rules: Static Pattern: Static Usage, - Rules: Directory Search: Selective Search, - Functions: Text Functions): Documented that `%' can be quoted. - - * variable.c (expand_function: `filter'/`filter-out'): Use pattern_p - to allow quoted %s in patterns. - - * variable.c (patsubst_expand): Use pattern_p on PATTERN and REPLACE - to allow quoted %s. Quoting backslashes are removed from REPLACE - even if PATTERN contains no unquoted %. - - * read.c (pattern_p): Made global. - * make.h: Declare pattern_p. - - * read.c (pattern_p): New function to search for an unquoted % in a - string. Backslashes quote %s and backslashes. Quoting backslashes - are removed from the string by compacting it into itself. Returns - nonzero if an unquoted % was found, zero if not. - (record_files): Use pattern_p to check for implicit rules. - (read_makefile): Use pattern_p to check for static pattern rules. - Also use it to allow quoted %s in `vpath' patterns; warn about - `vpath' patterns with no %s. - -Mon May 22 16:31:52 1989 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * glob.c (glob_filename): Replace a `1' with the `l' that should - have been there. This incidentally stops it from dumping core. - - * glob.c (glob_filename): If the path is just a directory, with no - file name pattern, return the directory alone. - - * glob.c (glob_tilde): New global variable (int), defaults to zero. - (glob_filename): If glob_tilde is nonzero, expand ~ or ~USER. - - * variable.c (string_glob): Keep a static allocated buffer for file - names taken from the list, instead of allocating and freeing one - every time. - -Fri May 19 18:06:26 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * make.c (decode_switches): Get floating numbers from the right string. - -Sun May 14 13:48:04 1989 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * commands.c (delete_child_targets): When deleting `also_make' - files, include the target's name in the message: - make: *** [foo] Deleting file `bar' - -Sat May 13 17:34:26 1989 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * make.c (max_load_average, default_load_average): Default to -1. - - * load.c (wait_to_start_job): Return if max_load_average is < 0.0, - not equal. - -Fri May 12 16:08:05 1989 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * variable.c (variable_buffer_output): Don't try to do pointer - arithmetic between objects not in the same array. - -Wed May 10 15:55:29 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * rule.c [M_XENIX] (default_suffix_rules, default_variables): Minor - changes to allow for strange compiler syntax. - - * rule.c (default_variables): Don't include "> $@" in - $(PREPROCESS.S), since it's already in the .S.s rule. - - * file.c (enter_file): Make a new double-colon file the `prev' - member of the bottom `prev' file (the one whose `prev' is nil). - - * read.c (do_define): Append newlines after copying the lines into - the value buffer, so we end up with a trailing newline. - - * make.c (print_version): If the global variable - `remote_description' is not nil or "", append "-%s" (its value) to - the version number. - * remote-*.c: Define remote_description appropriately. - -Sun May 7 15:15:53 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * commands.c (error_status): Converted to new function child_error, - taking new arguments TARGET_NAME and IGNORED, and writing an error - message: "*** [target] Error 1" (or signal #, etc.), appending - " (ignored)" if IGNORED is nonzero. - (child_handler): Use child_error instead of error_status. - - * compatMakefile (all): Don't depend on `doc'. - - * compatMakefile (clean): Don't remove make-info*. - (realclean): New rule, depends on `clean', removes tags, TAGS, - and all Info and TeX files. - -Thu May 4 17:00:46 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * variable.c (print_variable_data_base), file.c - (print_file_data_base), rule.c (print_rule_data_base), - Use floating-point for averages and percentages. - - * make.c (print_data_base): Print messages before and after the data - base information. - - * commands.c (print_commands): Changed output format to separate - lines in commands and prefix them with tabs. - - * dir.c (print_dir_data_base): Changed output format slightly. - - * vpath.c (struct vpath, construct_vpath_list, - selective_vpath_search): Remove the `exists' member and its uses. - - * vpath.c (print_vpath_data_base): New function to print all - selective and general VPATH search paths (for -p). - - * make.c (print_data_base): Call print_vpath_data_base. - - * file.c (print_file_data_base): Changed format to look more like a - makefile rule. Now reports all information in the `struct file'. - - * rule.c (print_rule_data_base): Changed format of display from: - %: (terminal) - depends on: RCS/%,v - to: - %: RCS/%,v - is terminal. - references nonexistent subdirectory. - Also include number and percent that refer to nonexistent - subdirectories. - -Thu Apr 27 15:45:40 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * make.c (main): Figure out the level of recursion before writing - the `Entering directory' message. - * variable.c (define_automatic_variables): Don't figure out the - level of recursion from `MAKELEVEL'. It's now done in main. - - * Version 3.48. - -Wed Apr 26 16:39:17 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * commands.c (child_handler): Set `update_status' to zero when there - are no more commands. - - * make.c (log_working_directory): If MAKELEVEL > 0, indicate the - recurson in the message (make[1]: ...). - - * commands.c (child_handler): Change status to `cs_finished' when - commands fail. - - * commands.c (start_job): Return 0 (success) if there were no more - commands for the child. - (child_handler): Change the status to `cs_finished' when start_job - fails to start the commands. - - * make.c (main): Don't handle SIGEMT if it's not defined. - Do handle SIGDANGER if it is defined. - - * commands.c (child_handler): Reorganized inner loop so that it - doesn't try to inspect the child before finding it. - -Tue Apr 25 16:28:24 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * make.c (end_of_token): Fixed bug wherein backslashes caused - immediate return. - - * Version 3.47. - - * make.texinfo (Implicit: Pattern Rules: Automatic): Document - setting of `$*' for explicit rules. Add note clarifying that - automatic variables, though referred to in the documentation as - `$<', etc. are no different than `$(<)', etc. - -Fri Apr 21 18:00:12 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * file.c (enter_file): Don't strip leading `./'s. - - * read.c (parse_file_seq): Strip leading `./'s. - -Thu Apr 13 17:26:41 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * make.texinfo (Commands: Parallel, Running: Options): Document that - -l with no argument removes a previous load limit. - - * make.c (struct command_switch): New member `default_value'. - (default_job_slots): Default value (of 1) for -j. - (default_load_average): Default value (of 0, unlimited) for -l. - (command_switches): Use default values for -j and -l. - Also, -l without an arg now means no load limit. - (define_makeflags): Don't write positive_int or floating options - whose values are their defaults. - - * make.c (main): Under -w, write a `Leaving directory' message - before re-execing. - -Tue Apr 11 16:46:29 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.46. - - * Makefile: Provide an easy place for system-specific definitions - (-DUSG, etc.) and extra object files (for whatever). - - * make.texinfo: Miscellaneous fixes from RMS. - -Mon Apr 10 19:31:34 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * rule.c (pattern_search): Put rules with `subdir' flags set in - TRYRULES, since these might be valid with VPATHs. In the TRYRULES - loop, don't do lookup_file or file_exists_p calls for dependencies - of rules with `subdir' flags set, but still do vpath_search calls - and intermediate-file searches. - -Thu Apr 6 16:33:00 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * make.texinfo (Implicit: Pattern Rules: Automatic): Document the - new definition of $* for explicit rules. - - * commands.c (execute_file_commands): If FILE->stem is nil, figure - out if FILE->name ends in a suffix in the .SUFFIXES list; if so, - store the name sans suffix in FILE->stem (and $*). - -Wed Apr 5 15:24:48 1989 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * file.c (remove_intermediates): Don't use `file_exists_p' to check - for the existence of intermediate files, because the hashed - directories will probably be out of date. - - * commands.c (child_handler): Free the good stdin before running the - next command line. - - * commands.c [USG] (init_siglist): Don't case SIGEMT if it's not - defined. Do case SIGDANGER (for IBM RT) if it is defined. - - * commands.c: Changed `SYS_WAIT' to `HAVE_SYS_WAIT'. - (child_handler): Use `wait3' if HAVE_SYS_WAIT is #defined. - - * file.c (enter_file): If any `./'s are stripped off, allocate a new - copy of the shortened name. - - * rule.c (pattern_search): Allocate the right length strings for - `also_make' members. - -Sat Apr 1 13:28:38 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.45. - - * GNUmakefile: Make a separate tarfile of the DVI and info files. - - * make.c (define_makeflags): If a switch that takes an argument has - its default value, put the switch in MAKEFLAGS with no arguments. - - * make.c (command_switches): Pass `-l' in MAKEFLAGS. - -Wed Mar 29 17:50:05 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * GNUmakefile: Don't include the DVI and info files in the dist. - - * commands.c (child_handler): Don't call - check_changed_{directories,vpaths}. - - * make.h: Don't declare check_changed_{directories,vpaths}. - - * vpath.c (check_changed_vpaths): Removed this function. - - * dir.c (struct directory): Remove `modtime' member. - (find_directory): Don't set `modtime' member. - (check_changed_directories): Removed this function. - - * remake.c (update_file_1): Set FILE->command_state to cs_finished - if it didn't need to be remade. - - * remake.c (update_file): Only write the "up to date" message if the - target went from `not_started' state to `finished' state without - incrementing the count of files remade. - - * commands.c [USG] (init_siglist): If both SIGCHLD and SIGCLD are - defined, don't put them both in the `switch'. - -Tue Mar 28 15:37:02 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * file.c (rename_file): Change FILE's name!!! - - * rule.c (create_pattern_rule): Set the `terminal' member of the new - rule after calling new_pattern_rule, which zeros it. - - * rule.c (default_variables): Use $(C++) in $(COMPILE.cc)! - -Sun Mar 26 15:52:30 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Makefile: Added a `clean' target. - -Fri Mar 24 15:08:46 1989 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * Version 3.44. - - * file.c (rename_file): If a `struct file' for the renamed-to name - exists, and it is a target or has deps or commands, barf. - If not just remove the old one for put in the new one. - - * remake.c (update_file_1, check_dep): Changed it back so that equal - modtimes to NOT make dependencies be considered newer. RCS checks - out files with equal modtimes as the RCS files, so this screws it. - - * make.h, glob.c: If __GNUC__ is defined, use __builtin_alloca. - - * Makefile: Use variables `ALLOCA' and `ALLOCASRC' so systems - without a good standard alloca can get it from the Emacs - distribution (or somewhere). - - * dir.c: Don't include , since make.h does. - - * make.c: Removed debugging version of getwd. - -Thu Mar 23 16:16:27 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.43. - - * remake.c (update_file_1): If a dependency loop is found, don't - fatal. Emit an error message and remove the dependency. - - * remake.c (library_file_mtime): Fixed to use the right names. - (update_file_1, check_dep): Consider a dependency "newer" than its - dependent if they have the same modification time. - -Wed Mar 22 19:31:35 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * file.c (remove_intermediates): Don't try to remove nonexistent files. - -Mon Mar 20 10:21:22 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.42. - - * rule.c (default_variables): Set F77 to $(FC) and F77FLAGS to - $(FFLAGS) so explicit rules expecting these (which are in System V) - will work. However, there is no way to make setting these affect - the implicit rules, unless we trash FC and FFLAGS (which BSD uses). - [USG]: Set GET to `get' rather than `/usr/sccs/get'. - -Sun Mar 19 20:00:27 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * vpath.c (construct_vpath_list): Don't replace VPATH[ELEM] with - dir_name (V), because the latter may get freed. - -Sat Mar 18 15:01:39 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.41. - - * make.texinfo: Cleaned-up edition 0.1 Beta from RMS and Bob Chassell. - - * file.c (rename_file): If a file with the new name already existed, - use the same storage space, after freeing the old file's name, deps, - and `also_make' member, preserving the link in the chain. - Also write an error message telling the user to report the incident; - I don't think this should be able to happen, but I'm not sure. - - * file.c (rename_file): Don't add the hash values of the old and new - names together! Reset HASHVAL before computing the second value. - - * dir.c (check_changed_directories): Zero the new file hash table - after allocating it. - - * dir.c (dir_file_exists_p): If FILENAME is "", return 1 if the - directory exists. - - * vpath.c (check_changed_vpaths): New function to run through the - search paths of all VPATHs, making the `exists' members correspond - to reality. - - * commands.c (child_handler): Call check_changed_vpaths. - - * make.h: Declare check_changed_vpaths. - - * vpath.c (struct vpath): New element `exists', an array of char - flags; exists[N] is nonzero if searchpath[N] exists. - (construct_vpath_list): Set the `exists' member. - (selective_vpath_search): Don't search directories whose `exists' - elements are zero. - - * read.c (read_makefile): Set the `dontcare' flag of makefiles - from the MAKEFILES variable if they were not mentioned anywhere but - in the MAKEFILES variable. - - * read.c (read_makefile): Don't write an error message if fopen - fails for a makefile from the MAKEFILES variable. - - * dir.c (struct directory): Add `modtime' member to record the - modification time of the directory when it was opened. - (check_changed_directories): New function to check all known - directories; if their modtimes have changed since they were opened, - their file tables are cleared and they are reset to be read in. - - * commands.c (child_handler): Call check_changed_directories before - returning. - make.h: Declare check_changed_directories. - -Tue Mar 14 20:07:13 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.40. - - * make.c (print_version): Made the copyright say 1988, 1989. - - * read.c (read_all_makefiles): Don't set *MAKEFILES to the name of - the end of the read_makefiles chain, since the latter may be from an - included makefile. (Why did I do this before?) - - * make.c (main): Set argv[0] to "" if it was nil. Don't put the - command-line variable definitions into argv[0], only into the MAKE - variable! - -Sun Mar 5 20:44:08 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * ar.c (ar_member_date, ar_touch): Remove the trailing ) from the - member name. - -Fri Mar 3 18:15:15 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * commands.c (construct_command_argv): Initialize NEW_ARGV to 0. At - `slow' label, if NEW_ARGV is not 0, free it; then allocate 4 strings. - -Tue Feb 28 14:29:39 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.39. - - * COPYING, make.texinfo: New GNU General Public License, version 1. - - * *.c, *.h, Makefile: New copyright notices for the new GNU General - Public License, version 1. - - * commands.c [USG]: Define WRETCODE correctly (again). - - * variable.c (expand_function: `shell'): Don't capture the standard - error output of the shell command. - - * ar.c (ar_touch, ar_member_date): Allocate MEMNAME with the right - length. - - * load.c [not UMAX] (load_average): Don't clobber the first nlist - member when trying to set the second! - -Thu Feb 23 13:13:53 1989 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * commands.c (child_handler): Really ignore errors under -i and for - - lines, don't just print a different message. - - * make.c (decode_switches): Fixed handling of arguments (or lack - thereof) to switches. - -Wed Feb 22 16:25:39 1989 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * commands.c (construct_command_argv): Don't clobber LINE when - checking the IFS variable. - -Sun Feb 19 11:17:07 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * load.c [UMAX, not NO_LDAV] (load_average): Return 0.0 rather than - randomness when calls fail. - - * Version 3.38. - - * commands.c (fatal_error_signal): If handling a user kill signal - (TERM, INT, HUP), wait for the children without printing the - "Waiting for children" message, since they will die quickly. - - * Version 3.37. - - * remote-stub.c (remote_status): Take another arg, BLOCK. If this - is nonzero block waiting for remote children. If not, return 0 if - we would have to block. - - * commands.c (child_handler) [not USG]: If called as a signal - handler, use wait3 and don't block. - [USG]: If called as a signal handler, return after handling one child. - -Sat Feb 18 13:37:04 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * file.c (snap_deps): Process all double-colon entries of each file, - not just the first one. - - * Version 3.36. - - * remote-stub.c: remote.c renamed. - remote.c: Just include remote-stub.c - - * commands.c (child_handler): If we were called as a signal handler, - return after handling one child. - - * commands.c [not USG]: Include and define `sigmask' if - doesn't. - (block_children, unblock_children): Use sigmask rather than - bitshifting explicitly (and incorrectly). - - * remote.c (remote_kill): New function to send a signal to a - remote child. - - * commands.c (fatal_error_signal): If we get a SIGTERM, send one to - each living child. If we get a SIGTERM, SIGINT, or SIGHUP, delete - all pending targets before waiting for children. - (struct child): Add new member `deleted'. - (start_job): Initialize `deleted' member to 0. - (delete_child_targets): New function to delete a given child's - targets, unless the `deleted' flag in the `struct child' says they - have already been deleted. Sets this flag before returning. - -Thu Feb 16 18:32:07 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * commands.c [USG]: Define `WRETCODE' correctly (X & 0xff00). - -Tue Feb 14 16:05:00 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * commands.c (construct_command_argv): Don't make the 0th element of - the argument list be "sh" when executing /bin/sh, because start_job - uses the 0th element as the program name. - -Sun Feb 12 17:42:05 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.35. - - * read.c (readline): Put a null in the beginning of the buffer - before starting the reading loop. - - * read.c (read_makefile): Made main reading loop while - !feof (infile), and removed EOF check after calling readline. - -Sun Feb 5 19:52:38 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * remote.c (block_remote_children, unblock_remote_children): New - (stub) functions to block and restore asynchronous notification of - remote child death. - - * commands.c (block_children): Call block_remote_children. - (unblock_children): Call unblock_remote_children. - (child_handler): If called as a signal handler, block remote - children on entry and unblock them before returning. - - * commands.c (child_handler): For unknown children, if they are - remote, give their remote ID; if local, give their PID and make's. - - * commands.c (execute_file_command): Don't put a new child in the - chain unless start_job succeeds. Block children before calling - start_job, and unblock them after putting the child in the chain and - incrementing `job_slots_used' (if start_job succeeded). - - * commands.c (block_children, unblock_children): Make these globally - visible (not `static'). - commands.h: Declare block_children and unblock_children. - - * variable.c (expand_function: `shell'): Use - `shell_function_completed'. Block children before forking and - unblock after `shell_function_pid' is set properly and - `shell_functon_completed' is reset to 0. - - * commands.c (child_handler): When the child of the `shell' function - completes, set `shell_function_completed' to 1 if it actually ran, - or -1 if it didn't (due to fork or exec failure). - - * commands.c (block_children, unblock_children): New functions to - block and unblock the child termination signal. - (wait_for_children): Use block_children and unblock_children. - (execute_file_commands): Block children around the critical section - wherein a new child is put on the chain. - - * make.c (main): Change the environment to contain the correct - MAKELEVEL before re-execing. - -Sat Feb 4 18:28:48 1989 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.34. - -Fri Feb 3 16:36:49 1989 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * rule.c (default_variables): Fixed $(LINK.c). - -Wed Feb 1 18:05:07 1989 Roland McGrath (mcgrath at pepper.Berkeley.EDU) - - * Version 3.33. - - * version.c: Removed copyright notice, since this is a one-line file. - - * commands.c (error_status): Made it return BUF, rather than running - off the end (this apparently worked on Sun 3s for some reason). - - * ar.c, commands.c, dep.h, load.c, make.c, make.h, read.c, remake.c, - rule.c, variable.c, Makefile: Changed copyrght notices to cover 1989. - -Mon Jan 30 15:51:28 1989 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * Version 3.32. - -Fri Jan 27 20:09:24 1989 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * remake.c (remake_file): Don't touch phony targets. - - * rule.c (convert_to_pattern): Fixed an incorrect length passed to - savestring. - - * variable.c (expand_function: `shell'): Close the read side of the - pipe on the parent side of the fork. - - * commands.c (start_job): On the child of the fork, close the - BAD_STDIN fd if we're not using it. - - * read.c (record_files): A file beginning with a dot can be a - default target if it also contains a slash (as in `../foo'). - - * commands.c (wait_for_children): For BSD, block SIGCHLD rather than - ignoring it to avoid a race condition when child_handler is returning. - - * commands.c (child_handler): Do blocking waits. - (error_status): Return a string describing exit status. (Split out - of child_handler). - - * read.c (multi_glob): Change VECTOR to VEC for Alliant. - -Thu Jan 5 00:06:51 1989 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * Version 3.31. - - * make.texinfo (Features): Noted $(foo:PAT=SUB) from SunOS 4.0. - - * make.texinfo (Options/Recursion): -d and -p go in the environment. - - * load.c: Include "commands.h". - -Wed Jan 4 17:49:25 1989 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * make.c (switches): -d and -p can come from the environment and are - put into it. - - * read.c (record_files): Fixed the checking for duplicate deps so it - doesn't clobber the first one. - - * make.texinfo: Documented default implicit rule changes. - - * rule.c: Revamped default suffix rules. They now use Sun's style - of using variables `COMPILE.c', `LINK.c', etc. for each suffix, and - use `TARGET_ARCH' and `TARGET_MACH' variable where appropriate. - Also support Modula-2 compilation (suffixes .sym, .def, and .mod). - Ratfor Yacc support is gone, since nobody has yacc -r. - All EFL support is gone, since nobody uses EFL. - - * ar.c, arscan.c: Don't assume `long int' and `int' are the same. - - * commands.c [USG]: Fixed wait status bit encoding. - [USG and not USGr3] (dup2): Define this for SysVr2. - - * make.h, dep.h, make.c [iAPX286]: Make allowances for this - brain-damaged compiler. - - * make.texinfo (Variables: Flavors): Fixed a typo. - -Tue Jan 3 18:09:31 1989 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * ar.c (ar_member_date, ar_touch): Truncate member names to 15 chars. - - * Version 3.30. - - * commands.c [SYS_WAIT]: If this is defined, use BSD - and wait3 even if USG. - - * read.c (record_files): Defining .DEFAULT with no deps or commands - clears its commands. - - * rule.c (default_suffixes): Added `.sh'. - (default_suffix_rules): Added single-suffix .sh rule, copies source - to target and makes target executable. - make.texinfo (Catalogue of Rules): Documented .sh rule and its use - in conjunction with SCCS. - - * rule.c (set_default_suffixes): Define variable `SUFFIXES' to the - default list ("" under -r). - make.texinfo (Suffix Rules): Document `SUFFIXES' variable. - - * rule.c (default_variables), make.texinfo (Implicit Variables): - Variable AR defaults to `ar', ARFLAGS to `rv', and RM to `rm -f'. - - * rule.c (install_default_pattern_rules): Default variables are made - recursive. - (default_variables): Added "CPP", defined to "$(CC) -E". - (default_suffixes): Added `.S', before `.s'. - (default_suffix_rules): New rule for .S to .s, runs CPP. - All rules that use CPP now include "$(CPPFLAGS)". - make.texinfo (Catalogue of Implicit Rules, Implicit Variables): - Documented above changes. - - * commands.c [USG] (sys_siglist): Don't define. - [USG] (init_siglist): New function to initialize sys_siglist. - - * make.texinfo (Variables: Reference): Documented `$(foo:PAT=SUB)' - references. - - * variable.c (variable_expand): A reference `$(foo:PAT=SUB)' is - equivalent to `$(patsubst PAT,SUB,$(foo))'. - - * variable.c (variable_expand): Free the storage for the expansion - of a recursive variable when it is nod longer needed. - - * variable.c (variable_expand): When checking for `$($(foo))', use - lindex so as not to search for the second `$' outside the parens. - - * make.c (struct stringlist, main, decode_switches): Changed `index' - member to `idx'. - -Sat Dec 24 16:02:32 1988 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * commands.c (wait_for_children [USG]): Handle SIGCLD with SIG_DFL, - rather than SIG_IGN. Ignoring SIGCLD reportedly makes wait return -1. - - * arscan.c [USGr3]: Define PORTAR to 1 (as with sun386). - (ar_scan [USGr3]): Remove trailing slashes from member names. - -Thu Dec 22 17:54:05 1988 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * make.texinfo (Makefiles: Overriding Makefiles): New node - documenting use of .DEFAULT to have one makefile defer unmakeable - targets to another. - - * make.texinfo (Implicit: Using Implicit, Implicit: Last Resort): - Mention empty commands and xref node `Empty Commands'. - -Wed Dec 21 20:12:40 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * Version 3.29. - - * make.c (struct command_switch, command_switches, et al): New - member `noarg_value', if not nil, ptr to value to use if no arg is - given to a switch that would otherwise require one. The -j option - can now be given w/o an arg, to mean infinite jobs. - * commands.c: If job_slots is zero, infinite jobs. - - * read.c (read_all_makefiles, read_makefile): Make makefiles precious. - - * make.c (decode_switches): For a positive_int or floating option, - if we moved to the next argument word, but found no argument for the - option, move back to the correct word. - - * make.c (decode_switches): If we got any unknown options, die after - processing all arguments. - - * GNUmakefile: Moved `include depend' to the end, so the default - goal will be set before then. - - * load.c (wait_to_start_job [Unix, UMAX]): Merged into one version - under #ifdef LDAV_BASED. Only loop while we have jobs running. - Sleep for increasing amounts (increase one second per iteration) - before checking the load average (after the first check). - Get the load average from function load_average. - (wait_to_start_job [not LDAV_BASED]): Always return. - (load_average [UMAX]): Fetch load average for Encore UMAX. - (load_average [not NO_LDAV]): Fetch load average from /dev/kmem. - [not NO_LDAV]: Define LDAV_BASED. - -Tue Dec 20 18:54:50 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * Version 3.28. - - * commands.c (wait_for_children): Take second arg, ERROR. If - nonzero, and there are children, print a message on stderr. - (execute_file_commands, fatal_error_signal): Pass second arg. - * make.c (die), remake.c (update_goal_chain), variable.c - (expand_function: `shell'): Ditto. - -Sat Dec 17 01:05:38 1988 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * commands.c (start_job): Call wait_to_start_job before forking. - - * load.c (load_average): Converted to wait_to_start_job. - - * remote.c: New file for remote execution functions. - (start_remote_job_p): Return nonzero if the next job should be run - remotely. - (start_remote_job): Start a remote job and return an ID for it. - (remote_status): Get status of dead remote children. - -Fri Dec 16 16:51:07 1988 Roland McGrath (mcgrath at hecuba.Berkeley.EDU) - - * commands.c (start_job): If start_remote_job_p () returns nonzero, - call start_remote_job to start the job rather than fork and exec. - (child_handler): - - * commands.c (execute_file_commands): Moved load average checking to - start_job. - - * commands.c (child_handler: USG): Record the pid wait returns. - - * load.c (UMAX): Added some #include's needed for UMAX. - - * read.c (multi_glob), variable.c (string_glob): Ignore a (char **) - -1 return from glob_filename. - - * variable.c (variable_expand): Make sure we don't increment past - the end of the string we were passed. - - * variable.c (variable_expand): Terminate the expansion. - - * file.c (rename_file): If there is already a file under the new - name, set its contents equal to FILE's (ick). - - * variable.c (define_automatic_variables): Pass all the args to - define_variable when defining MAKELEVEL! - - * commands.c (execute_file_commands): If max_load_average > 0, and - we have children running, don't start up another child until the - load average goes below max_load_average. - - * make.c: New variable `max_load_average'. - (struct command_switch, decode_switches, decode_env_switches): - Handle floating-point (double) args. - (command_switches): Added `-l' switch to set `max_load_average'. - - * load.c (load_average): New file and function to return a double - that is the current load average (1.00 scale). - * GNUmakefile, oldMakefile: Pass flags in $(LOAD_AVG) for load.c. - -Thu Dec 15 15:22:08 1988 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * Makefile: Renamed to oldMakefile. - * GNUmakefile: Make Makefile from oldMakefile and depend. - - * read.c (read_all_makefiles): When putting the default makefiles in - the read_makefiles chain so they will be remade, put them in the - right order. - - * remake.c (update_goal_chain): If MAKEFILES is nonzero, always make - in serial, and return as soon as one goal whose `changed' member is - nonzero is successfully remade. - - * commands.c: Don't include . - - * commands.c (construct_command_argv): Added ` to sh_chars. - - * make.h: Don't declare construct_makeflags. - - * make.c (main): Set up MAKEFLAGS and MFLAGS and make an environment - both before and after reading the makefiles, so the makefiles can - use them and possible change them, and later children will get the - right information. - (construct_makeflags): Replaced with define_makeflags (static void), - which defines the two variables. - * variable.c (define_automatic_variables): Don't define MAKEFLAGS - and MFLAGS. - -Mon Dec 12 14:40:31 1988 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * Version 3.27. - - * commands.c (child_handler): Reset the handler to ourselves when - called for USG, since it has no safe signals. - - * commands.c: For USG, use an int rather than a `union wait' for - wait calls, and dissect it with bitmasks. - (child_handler): No wait3 system call in USG. Since we can't - protect from hanging, always return immediately if we have no - children we know about and we're not running a `shell' function. - (There is still the danger of hanging waiting for a child that died - without our being notified.) - - * remake.c: Include instead of . What we need - is really in , and while BSD includes - , USG doesn't. - - * make.c (main): Figure out the program name before doing anything - which might need it (in a call to error or fatal). - - * dir.c, glob.c: Use `struct dirent' and for USGr3. - - * arscan.c (ar_scan): Added missing & before buf (which is an int) - if SARMAG is not defined (SysV). - -Fri Dec 9 18:44:13 1988 Roland McGrath (mcgrath at pepper.Berkeley.EDU) - - * Version 3.26. - - * dir.c (find_directory, dir_file_exists_p): Keep track of how many - directories we have open and don't let it be more than - MAX_OPEN_DIRECTORIES (currently 10). - - * variable.c (expand_function: `foreach'): Use expand_argument - rather than variable_expand so each repetition doesn't clobber the - last!!! - -Mon Dec 5 15:58:46 1988 Roland McGrath (mcgrath at hecuba.Berkeley.EDU) - - * Version 3.25. - - * Makefile: Define `install' target. - - * GNUmakefile: Don't include GNUmakefile or depend in the - distribution file. - -Wed Nov 30 15:53:42 1988 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * commands.c (execute_file_commands): Don't clobber a null into - random storage if there were no $^ and/or $? words. - - * remake.c (check_dep): Set *MUST_MAKE_PTR nonzero if a dependency - doesn't exist. - - * ar.c (ar_member_date, ar_touch): Make sure the modtime of the - archive file itself is known before we fetch or change the modtime - of one of its members. - - * read.c (read_makefile): Expand variable and function references - before parsing rules so variable can contain special characters - (colons and semicolons). - -Sat Nov 26 11:36:31 1988 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * variable.c (expand_function: `filter', `filter-out'): Fixed so - that filter-out works right. - - * variable.c (expand_function: `filter', `filter-out'): Made these - functions use each word of their first argument as a pattern. - -Fri Nov 25 10:51:47 1988 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.24. - - * read.c (record_files): If a target is listed more than once in a - single rule (that defines commands), give a warning message rather - than the counter-intuitive message saying commands were already - defined (in the same place). - - * make.c (fatal, error): Made them both take 6 args since there is - at least one error message that need that many. Too bad vfprintf is - not universal! - - * Version 3.23. - - * read.c (read_makefile): Moved the construction of the `struct - commands' into record_files. Call record_files before recursing for an - included makefile so the higher-up will determine the default goal. - (record_files): Take arguments COMMANDS, COMMANDS_IDX and - COMMANDS_STARTED and construct a `struct commands. - -Thu Nov 24 14:36:33 1988 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.22. - - * make.c (main): Made it a fatal error if we can't move back to the - directory we started in before re-execing. - - * make.c (main): Get the current directory before doing anything - else, so we know it even if we don't need it for the value of - `MAKE', since we might want it when re-execing. - -Wed Nov 23 13:34:44 1988 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * Version 3.21. - - * read.c (record_files): Eliminate duplicate deps in a chain. - - * variable.c (expand_function: `sort'): Pass the right number to - qsort, not one less. - - * remake.c (remake_file): Always call notice_finished_file if - FILE->command_state == cs_finished. - - * commands.c (execute_file_commands): Call notice_finished_file to - set FILE's status correctly when start_job fails (because it's out - of commands or running under -n). - -Fri Nov 18 15:31:12 1988 Roland McGrath (mcgrath at saffron.Berkeley.EDU) - - * Version 3.20. - - * remake.c (update_file_1): Set the `update_status' of FILE to - nonzero and set FILE's `updated' bit if we have decided to give up - on remaking FILE because of errors in the dependencies. - - * rule.c (pattern_search): Debugging messages use `dependency' (vs. - `dependent') properly. - - * make.texinfo (Conditionals: Conditional Syntax): Function index - entries for `ifndef' and `ifneq'. - - * variable.c (define_automatic_variables): Define `MAKELEVEL' to the - decimal number of the makelevel, since it may be malformed or blank. - - * remake.c (remake_file): Call notice_finished_file after touching. - -Sat Nov 12 19:29:34 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * Version 3.19. - - * GNUmakefile (dist): Pass the `-f' flag to compress. - - * vpath.c (build_vpath_lists): Check for VPATHS being nil after - constructing the general VPATH list from the `VPATH' variable. - -Fri Nov 11 08:02:26 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * make.c (fatal, error): Made error messages for recursive runs be - shorter. - -Thu Nov 10 16:51:36 1988 Roland McGrath (mcgrath at basil.Berkeley.EDU) - - * Version 3.18. - - * read.c (read_makefile): Made it eat leading spaces and formfeeds - (but not tabs), like it's documented to. - - * read.c (read_makefile): Let included makefiles determine the - default goal, as is done by System V Make. - -Tue Nov 1 19:03:08 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * variable.c (new_environ): Don't increment VCNT when a variable is - rejected. - -Fri Oct 28 16:54:15 1988 Roland McGrath (mcgrath at basil.Berkeley.EDU) - - * Version 3.17. - - * rule.c (convert_to_pattern): Don't use the same storage for a name - in two rules since new_pattern_rule may free this storage when a - rule is discarded. - - * rule.c (new_pattern_rule): Undid useless change I made Oct 25. - -Thu Oct 27 19:17:53 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * Version 3.16. - - * GNUmakefile, Makefile: Fixed a typo in a comment. - * Makefile: Removed malloc.o from object file list. - - * variable.c: Removed old debugging #define's for xmalloc and - xrealloc so non-ANSI cpp's won't barf. - - * make.c (main): Made local array for temp file name static so - compilers that don't do auto aggregate initialization won't barf. - - * read.c: Removed static declaration of copy_dep_chain since it is - no longer static. - -Tue Oct 25 16:59:30 1988 Roland McGrath (mcgrath at pepper.Berkeley.EDU) - - * rule.c (new_pattern_rule): If we threw out the new rule because it - matched an old one and OVERRIDE was zero, don't put the freed - pointer in the chain! - -Wed Oct 19 15:07:43 1988 Roland McGrath (mcgrath at pepper.Berkeley.EDU) - - * Version 3.15. - - * variable.c (expand_function: `sort'): Don't do the sorting and - writing out if there were no words in the first place. - - * remake.c (remake_file): Only fail with a "no way to make" message - for a dependency (non-target) file. If we don't know how to remake - a target file, pretend it was successfully remade and is very new. - - * remake.c (remake_file): Don't increment `files_remade' for a - non-target file we don't know how to remake. - - * read.c (record_files): Don't die with "both : and :: entries" for - a file whose `is_target' flag is not set. - -Tue Oct 18 17:24:11 1988 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * variable.c (expand_function: `patsubst', `subst'): Free the right - things! - - * variable.c (expand_function: `subst'): Don't clobber the - pointer to the end of the second arg and then try to use it!!! - -Mon Oct 17 16:44:45 1988 Roland McGrath (mcgrath at catnip.Berkeley.EDU) - - * variable.c (expand_function: `patsubst'): Don't clobber the - pointer to the end of the second arg and then try to use it!!! - - * variable.c (expand_function: `word' function): Made it parse its - second argument correctly. - - * ar.c (ar_touch): Return 1 rather than -1 for on errors. - -Sat Oct 15 15:12:16 1988 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * Version 3.14. - - * GNUmakefile: Removed explicit rule for make.dvi since the built-in - implicit rule now works. - - * rule.c (default_suffix_rules): Fixed .texinfo.dvi rule yet again - so that it really works, now that parens are counted. - - * remake.c (update_file_1): Set FILE's `updated' flag after calling - remake_file if it failed or finished immediately. - - * remake.c (update_file): Use the `updated' flag rather than the - command state to decide if a file was fully considered, and - therefore might give an "up to date" message. - - * variable.c (expand_function): Made all functions that take more - than one argument count parens of the appropriate flavor in their - args and ignore commands nested in parens. - -Fri Oct 14 18:35:00 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * read.c (read_all_makefiles): Pass second arg to read_makefile for - default makefiles. - -Thu Oct 13 16:40:08 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * Version 3.13. - - * GNUmakefile: Added an explicit rule for make.dvi since the - built-in .texinfo.dvi implicit rule is screwed up. - - * rule.c (default_suffix_rules): Added a comment that the - .texinfo.dvi rule does not work because of an ahem, feature of Make - that at some point will be fixed--er, enhanced to alleviate this - difficulty. - - * rule.c (default_suffix_rules): Fixed Texinfo -> DVI rule (again). - - * make.texinfo (Commands: Execution): Documented new competing for - standard input among children. - - * commands.c (struct child): Added `good_stdin' flag to tell if this - child has the stdin that doesn't point into nirvana. - (good_stdin_used): New variable to tell if any child has the good - standard input. - (child_handler): Reset `good_stdin_used' if a dead child's - `good_stdin' flag is set. - (start_job): Give the new child the good standard input if - `good_stdin_used' is no set, and set the child's `good_stdin' flag - appropriately. - - * rule.c (default_suffix_rules): Changed Texinfo -> DVI rule to work - better (I hope). - - * read.c (read_all_makefiles): Stop reading default makefiles after - one is found. - - * read.c (read_makefile): Reset `reading_filename' and - `reading_lineno_ptr' after recursing for an included makefile. - - * GNUmakefile: New GNU Make-specific makefile that does everything - Makefile does plus distribution stuff, and doesn't contain any hacks - to try to work with Unix make. - - * Makefile: Removed distribution stuff. - - * make.c (main): Use mktemp to construct the names of temporary - files used for standard input makefiles. - - * make.c (main): Don't turn standard input into a broken pipe. - - * commands.c (start_job): Keep two extra file descriptors around: a - good standard input, and a bad one that reads from a broken pipe. - On the child side of the fork, if there are other children, give - this one the broken pipe so they won't compete; if this is the only - one, give it the good standard input. - - * make.h: Declare notice_finished_file. - - * commands.c (execute_file_commands): Use noticed_finished_file - after waiting for the child when there is only one job slot. - - * remake.c (notice_finished_file): New function to re-check mtime's - and such things to be done when commands finish. - (update_file_1): Use notice_finished_file. - - * commands.c (child_handler, execute_file_commands): Use new - variable `job_slots_used' to record the number of jobs currently - running, rather than diddling with `job_slots'. - (execute_file_commands): Increment `job_slots_used' before calling - start_job and decrement it on failure to avoid race condition. - If there is only one job slot, wait for the child to finish and - return its status so commands are run in linear order, as if there - were no parallelism. - -Wed Oct 12 15:59:03 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * remake.c (remake_file): Don't print a "No way to make" message for - targets whose `dontcare' flags are set. - - * read.c (read_all_makefiles): Set the `dontcare' flag of the - `struct file' each default makefile added to the chain. - - * file.h (struct file): Add `dontcare' member. - - * read.c (read_all_makefiles): When no default makefiles are found, - put the names of all those tried in the `read_makefiles' chain so - they will be updated if possible, giving their `struct dep's' - `changed' members the value of 0 so we won't care if they cannot be - found or remade. - - * make.texinfo (Makefiles: Remaking Makefiles): Documented that - default makefiles will be remade if not found. - - * read.c (read_all_makefiles): If no default makefiles can be found, - go through the list of default names, trying to make one, stopping - if one is made. - - * remake.c (remake_file): Set STATUS to 0 after successfully touching. - - * dir.c (file_impossible, file_impossible_p): Don't clobber FILENAME - to "" and then try to to a strcmp on it!!! - -Mon Oct 10 16:09:18 1988 Roland McGrath (mcgrath at cinnamon.Berkeley.EDU) - - * make.c (main): Don't do `dir_load (".")'. - - * rule.c (count_implicit_rule_limits), vpath.c - (construct_vpath_list): Test the existence of a given directory by - `dir_file_exists_p (DIR, ".")' and assume that if this returns zero, - it means the directory really does not exist. - - * dir.c (struct dirdata): Replaced with `struct directory' for - directories, each containing a chain of `struct dirfiles', one for - each file (real or impossible). - (dir_load): Removed. - (find_directory): New function to find the `struct directory' for a - named directory and return it (possibly creating a new one). - (dir_file_exists_p): Read the directory on the fly if its stream is - still valid (and ever was) if the file we're looking for is not - already in the hash tables. - (file_impossible, file_impossible_p, dir_name, print_dir_data_base): - Use the new directory/file scheme. - - * make.texinfo: Miscellaneous editorial changes and clarifiactions. - - * commands.c (struct child): Remove `environ' member. - (child_handler, start_job, execute_file_commands): Remove use of - `environ' member and new_environ. - - * make.c (main): Call new_environ after reading makefiles. - - * variable.h: Declare `new_environ' to return void. - - * variable.c (new_environ): Put the environment in `environ' and - return void. - -Fri Oct 7 15:48:39 1988 Roland McGrath (mcgrath at pepper.Berkeley.EDU) - - * Version 3.12. - - * Makefile: Don't make the uncompressed tar file. - - * variable.c (expand_function: `shell' function): Made it not expect - read to null-terminate the buffer. - - * Makefile: Made it use a temporary symlink to . rather than a - temporary directory to make the distribution tar file. - -Thu Oct 6 17:52:35 1988 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.11. - - * make.texinfo: Fixed a line that got garbaged somehow. - -Mon Oct 3 16:14:39 1988 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * make.c (main): Try to move back to the directory we started in - before re-exec ourself. - - * remake.c (update_file_1): A double-colon target with no deps - always needs to be remade. - - * remake.c (remake_file): Changed "No way to make" message to say - `target' rather than `file'. - -Sun Oct 2 12:50:47 1988 Roland McGrath (mcgrath at catnip.Berkeley.EDU) - - * remake.c (update_file_1): Set FILE->update_status to the return - value of remake_file. - - * rule.c (convert_to_pattern): Fixed swapped lengths passed to - xmalloc for source/target suffixes. - - * make.texinfo: Documented that MAKEFLAGS and MFLAGS are read in - from makefiles. Updated the `Features' section a bit. - - * make.c (main): Read switches from MAKEFLAGS and MFLAGS variables - after reading in makefiles. - - * make.c (main): Put a line "/tmp/foo:;" rather than ".PHONY: - /tmp/foo" in front of temp files made for stdin makefiles. - - * remake.c (update_file): Test the state of the right `struct file' - for double-colon files. - - * make.c (main): Put a ".PHONY: /tmp/foo" line in front of temp - files made for stdin makefiles so they won't be remade when we - re-exec. Kludge-o-matic!! - - * remake.c (update_goal_chain): Judge files as being finished based - on their `updated' flag, not their state. - - * read.c (read_makefile): Don't check for FILENAME being "-". - (read_all_makefiles): Set each element of MAKEFILES to the name put - in READ_MAKEFILES by read_makefile, since read_makefile may free the - storage for the name it is passed, and someone might want to look at - the elements of MAKEFILES again. - - * make.c (main): For each `-f' flag with arg `-' (standard input), - read standard input into a temp file and pass the temp file's name - to read_all_makefiles, after making sure it will not be remade. - - * make.c (construct_makeflags): Always put out `-j1'. - -Sat Oct 1 00:19:59 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * commands.c (execute_file_commands): If commands are nothing but - whitespace, set the state to `cs_finished' before returning 0. - - * make.c (decode_switches): Allocate space for args in stringlists - so they can be freed later. - - * make.h: Declare `makelevel'. - - * variable.c (makelevel): Moved to make.c (and made global). - - * make.c (fatal, error): Print the makelevel if it's > 0. - (perror_with_name): Use error rather than calling fprintf directly. - (pfatal_with_name): Use fatal rather than fprintf and die. - - * variable.c (new_environ): Don't put default variables (origin - `o_default') into the environment; they just take up space. - - * read.c (read_makefile): Don't add FILENAME to the chain of read - makefiles if it's "-" (standard input). - - * remake.c (update_goal_chain): Set STATUS correctly when nothing - happens (as well as in all other situations). - - * make.c (construct_makeflags): Put a `-' before each switch and - spaces between them. - - * Version 3.10. - - * commands.c (wait_for_children): Don't check if `children' is nil. - This is the case when waiting for the child of a `shell' function. - - * dir.c (dir_load): Don't add a hash-table entry for directory - DIRNAME and filename "" if DIRNAME doesn't exist. - - * commands.c (execute_file_commands): Return 0 after start_job - returns 1 (failure) under the -n flag. - - * remake.c (remake_file): Set the state to `cs_finished' when not - calling execute_file_commands. - - * remake.c (update_goal_chain): Second arg is now MAKEFILES, nonzero - meaning to disable -t, -q, and -n for each target unless the target - was also given on the command-line. - - * read.c (read_makefile): Enter the `struct file's for the makefiles - added to the `read_makefiles' `struct dep' chain. - - * remake.c (update_goal_chain): Made it not enter the files for the - goals in the chain. It will already have been done. - - * rule.c (convert_to_pattern): Null-terminate the names of targets - and deps of the pattern rules properly. - -Fri Sep 30 18:56:20 1988 Roland McGrath (mcgrath at nutmeg.Berkeley.EDU) - - * make.c (main): Call install_default_pattern_rules. - - * make.h: Declare copy_dep_chain. - - * read.c (copy_dep_chain): Moved to make.c (and made global). - - * make.c (main): Call update_goal_chain to update goals. - Update read makefiles and re-exec self if they change. - - * remake.c (update_file): Make this function static. - (update_goal_chain): New function to update a `struct dep' chain of - goals, waiting until they are all finished before returning. - - * make.h: Don't declare update_file. Declare update_goal_chain. - - * make.c (main): Call snap_deps, etc. that were in read_all_makefiles. - - * read.c (find_makefile): Removed this function. - (read_all_makefiles): Don't update makefiles, don't diddle with - pattern rules, don't call snap_deps, etc. Return a `struct dep' - chain of all makefiles read. - (read_makefile): Now takes two args: FILENAME and TYPE, which is 0 - for a normal makefile, 1 for MAKEFILES variable or 2 for an included - makefile. Add a `struct dep' containing the name of the makefile - (as it was found in the search path for type 2s), and TYPE in the - `changed' member to the global `read_makefiles' chain. - - * make.h, rule.c (displace_pattern_rules, - add_displaced_pattern_rules): Removed these functions. - - * read.c (read_makefile): Variable-expand the name of an `include'd - makefile before calling find_makefile on it. - - * file.c (snap_deps): If the `struct file' for a `struct dep' - already exists, free the `struct dep's `name' member before setting - it to nil (since this info is in the `struct file'). - - * read.c (copy_dep_chain): Made it copy each name rather than - leaving multiple `struct dep's with the same pointers. - -Thu Sep 29 19:08:13 1988 Roland McGrath (mcgrath at catnip.Berkeley.EDU) - - * make.c (decode_switches): Fixed second decode_env_switches call to - use correct length of "MFLAGS" (6, not 5). - - * read.c (read_makefile): Don't stop reading when readline returns - zero lines read. Only stop when the stream reaches EOF. This makes - it recognize the last line of a makefile without a newline. - - * remake.c (remake_file): If we don't know how to make FILE, set its - command state to `cs_finished'. - - * remake.c (update_file): Don't write the "up to date" message if - update_file_1 returned a nonzero status. - -Wed Sep 28 16:30:07 1988 Roland McGrath (mcgrath at catnip.Berkeley.EDU) - - * commands.c (child_handler): Set the `update_status' member - properly for ignored errors. - - * rule.c (convert_to_pattern): Made it not care about if the target - suffix comes before the source suffix in the .SUFFIXES list. - - * make.texinfo: Misc editorial changes. - - * commands.c (wait_for_children): Return immediately if `children' - is nil (there are no children). - -Tue Sep 27 15:33:14 1988 Roland McGrath (mcgrath at pepper.Berkeley.EDU) - - * Version 3.09. - - * commands.c (struct child): New member `command_ptr' to hold the - current position in the commands. The `commands' member is never - changed. - (start_job, child_handler, execute_file_commands): Use new method - for `commands' and `command_ptr' members. - - * make.c (decode_env_switches): Skip past an invalid letter (instead - of looping forever). - - * commands.c (struct child): Add `environ' member to hold the - environment for this child. - (execute_file_commands): Get a new environment from new_environ and - put in the the new `struct child's `environ' member. - (child_handler): When freeing a child, free its `commands' member, the - elements of its `environ' array and its `environ' member itself. - (start_job): Set `environ' to the child's `environ' member before - exec'ing the command. - - * variable.h, variable.c (new_environ): Made it return the new - environment, not putting it in `environ'. - - * remake.c (update_file): Don't give a "is up to date" message - unless no files were remade and the state went from `cs_not_started' - to `cs_finished', so repeat calls to finish jobs won't get the message. - -Mon Sep 26 16:26:08 1988 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * Version 3.08. - - * make.texinfo (Commands: Execution): Documented that children will - be waited for rather than killed. - - * commands.c (fatal_error_signal): Wait for children. - (kill_children): Removed this function. - - * make.c (main, die): Wait for children to die, don't kill them. - - * variable.c (expand_function): Use wait_for_children. - - * make.c (main): Use wait_for_children rather than child_handler. - - * commands.c (wait_for_children): New function to block waiting for - children, insuring that child_handler is not called recursively. - (execute_file_commands, kill_children): Use wait_for_children. - - * commands.c (child_handler): Start up additional commands in a - sequence after an ignored error. - - * remake.c (update_file): Don't print "`foo' is up to date" messages - when update_file_1 returns while commands are executing. - - * remake.c (update_file_1): Pass the file name to name_mtime, not - the bloody `struct file', dammit!! - - * commands.c (child_handler): Print out the "*** ..." error message - when not under -i. (I somehow forgot this.) - - * remake.c (update_file_1): Use name_mtime rather than file_mtime to - re-get the mtime of a file whose commands have finished. - - * make.c (command_switches, decode_switches, decode_env_switches): - Make all switches that take string args allow them right after the - switch letter. - - * commands.c (child_handler): Check for a child being the `shell' - function's command returning and set the global variable for - expand_function to check. - - * variable.c (expand_function): For the `shell' function, instead of - waiting for the child shell ourselves, let child_handler do it and - loop around waiting for something to happen. - - * make.c (print_version): Made the copyright year static, not dynamic. - - * make.h, make.c: Remove construct_argv function. - - * make.c (main): Say "no goal target" instead of "no target". - - * make.texinfo (Commands: Parallel): Don't send SIGKILL. - - * commands.c (kill_children): Don't send SIGKILL to children that - aren't killed by the first signal. - - * make.c (main), commands.c (kill_children): Decide between SIGCHLD - and SIGCLD based on whether or not SIGCHLD is defined, not on USG. - - * Makefile: Link make with $(LOADLIBES). - - * read.c (construct_include_path): Fixed another bad xrealloc call. - - * make.c (decode_switches): Fixed an xrealloc call with no first arg. - -Sat Sep 24 01:16:21 1988 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * Version 3.07. - - * remake.c (update_file_1): If deps are running, set state to - `cs_deps_running' and return 0. If deps are done, run commands. - - * commands.c (child_handler): Made it delete non-precious targets - killed by fatal signals. - - * make.texinfo: Documented parallelism. - -Fri Sep 23 16:52:27 1988 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * remake.c (update_file_1): Don't return if FILE's state is - `cs_deps_running'. In that case, we need to run through and check - the states of all our dependencies. - - * commands.c (execute_file_commands): Decrement `job_slots' after - starting a new job to run file commands. - - * commands.c (start_job): Made it set the state to `cs_running'. - - * make.c (main): Fixed usage of `g', `lastgoal', and `goals' in the - goal-making loop. - - * commands.c (child_handler): When commands finish, set the - corresponding file's `update_status' and `updated' flags as - appropriate, and reset the modtimes of the file and any `also_make' - files it has. - - * remake.c (remake_file): Don't re-set `last_mtime' and set `updated'. - - * commands.c (fatal_error_signal): Don't swallow all the children - with a loop around `wait ((union wait *) 0)'!!! - - * make.c (struct command_switch): Added `positive_int' type. - (switches): Added -j (job_slots). - (construct_makeflags, decode_switches, decode_env_switches): - Handle`positive_int'-type switches. - - * glob.c (glob_vector): Rename local variable `vector' to `VeCtOr'. - This is said to avoid a conflict with some system's global `vector' - variable. - - * variable.c (expand_function): Made the `shell' function use - construct_command_argv and do its own child control and piping. - - * make.c (main): Turn standard input into a broken pipe after - reading in all makefiles (the last time it will be needed). - - * commands.c (struct child): Remove `pipe_fd' member. We don't use - pipes any more. - (start_job): Return 0 for success, 1 or failure (rather than void). - Don't use pipes. Don't turn the child's stdin into a broken pipe. - (child_handler): Print "*** Error" messages when necessary. - Die on failed commands when -k was not given. - (execute_file_commands): Check the return of start_job and remove - the child from the chain and return failure if it is nonzero. - - * make.c (die): New function to clean up and exit. - (fatal, pfatal_with_name): Use die. - -Thu Sep 22 14:27:11 1988 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * commands.c (struct child): Added `commands', `pipe_fd', and - `noerror' members to keep track of info about a command thread. - (start_job): New function to start a job and update the argument - `struct child' to reflect its status. - (execute_file_commands): Merged run_file_commands back in. - Made it use new start_job function. - - * rule.c (freerule): Don't free the `struct commands' of the - discarded rule. It may be used in more than one place. - - * commands.c (execute_command_line): Made it not try to delete the - possibly partly-made file. The child_handler function will do this. - (fatal_error_signal): Ditto + call kill_children. - - * make.h: Declare job_slots. - - * make.c (main): Collect goals in a dep chain and run through this - chain waiting for a child, eliminating finished goals, updating all - remaining goals, and quitting if they fail and not -k. - - * commands.c (child_handler): If called with SIG < 0, - SIG is the - max number of children to bury. - - * commands.c (child_handler): If called with SIG as zero, - block waiting for running children. - (kill_children): Call child_handler with zero rather than SIGCHLD. - - * remake.c (update_file_1): Use the `command_state' member of FILE - and its dependencies to determine what commands are running, what to - do, etc. If commands or dep commands are running when we are - called, return success (0). If commands finished since the last - time we were called, return their status. - - * commands.h: Declare kill_children. - - * commands.c: Define `struct child' to keep track of child - processes, with the chain in `children'. - (child_handler): New function to catch child-termination signals - (SIGCHLD, or SIGCLD for USG), store the returned status in the - appropriate structure, take the now-obsolete `struct child' out of - the chain, and free its storage. - (execute_file_commands): Put all of the stuff invloving running the - commands into new function run_file_commands. Execute_file_commands - now does process management for the commands, while - run_file_commands (which is run in a subprocess) runs the commands. - (kill_children): New function to kill all running children by - sending them signal SIG. If there are any children still living - after they are all sent SIG, they are all sent SIGKILL. - - * make.c (main): Catch SIGCHLD (SIGCLD for USG) with child_handler. - - * commands.h: Declare child_handler function. - - * commands.c (execute_file_commands): Check the `command_state' - member of FILE and return 0 if it is `cs_running' or - `cs_deps_running' and return the stored status if it is `cs_finished'. - - * file.h (struct file): Added `command_state' member. - - * commands.c (execute_command_line): Add `$' to the list of - characters special to the shell. - -Wed Sep 21 15:57:41 1988 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * read.c (read_all_makefiles): Call convert_to_pattern before - recomputing the limits after adding the displaced rules. - - * make.c (main): Move calls to snap_deps, convert_to_pattern, and - build_vpath_lists to read_all_makefiles. - - * read.c (read_all_makefiles): Install the default pattern rules - before checking to remake the makefiles, displace these rules before - reading in the makefiles, and then add the displaced rules to the - chain after reading in all the makefiles. - - * make.c (main): Don't call install_default_pattern_rules or - count_implicit_rule_limits. - - * make.h: Declare displace_pattern_rules and - add_displaced_pattern_rules. - - * rule.c (displace_pattern_rules, add_displaced_pattern_rules): New - functions to stow the chain and add the stowed chain on the end of - the current chain. - - * make.texinfo (Implicit: Search Algorithm): Fixed PREV reference. - - * make.c (main): Call construct_include_path right after decoding - the switches. - - * read.c (find_makefile): Use rename_file. - - * file.h: Declare rename_file. - - * file.c (rename_file): New function to rename a `struct file' and - put it in the correct hash bucket. - - * read.c (find_makefile): New function to find and update a makefile. - (read_all_makefilese): Use find_makefile. - (read_makefile): Don't do updating. Removed UPDATEIT arg. - - * remake.c (update_file_1): Took out setting the `updated' member to - -1 rather than 1 sometimes. - - * make.c (main): Made it print version info before doing anything else. - - * remake.c (library_file_mtime, f_mtime): Removed use of last two - arguments to vpath_search. - - * rule.c (pattern_search): Removed use of last two arguments - to vpath_search. - - * vpath.c (vpath_search, selective_vpath_search): Removed unused - DIRPREFIX and DPLEN args. - - * read.c (read_makefile): Also turn off -n when updating makefiles. - -Tue Sep 20 17:01:10 1988 Roland McGrath (mcgrath at pepper.Berkeley.EDU) - - * Makefile: Put tags files in the tarfile. - - * read.c (read_makefile): Get the modtime of the makefile via a stat - call so that a later file_mtime call won't do VPATH search for it. - - * read.c (read_makefile): Don't turn off -t and -q if the makefile - was a command-line target. - - * make.c (main): Enter command-line targets as files and set their - `cmd_target' members. - - * file.h (struct file): Added `cmd_target' member. - - * read.c (read_makefile): Temporarily turn off -t and -q while - updating makefiles. - - * make.c (main): Don't use arg 0 from other_args (which is now - argv[0]; i.e., the program's name). - - * read.c (read_makefile): Only return nonzero if commands were - actually run to remake the makefile. - - * remake.c (update_file_1): Set FILE->updated to -1 if no commands - were actually run (because no update was done or -t was given). - - * make.c (decode_switches): Fixed bug wherein xrealloc was passed - bad args if it tried to expand other_args->list. - - * read.c (read_all_makefiles): Made it not look at the `MAKE' - variable, just use argv[0]. - -Sun Sep 18 17:34:11 1988 Roland McGrath (mcgrath at paris.Berkeley.EDU) - - * read.c (rerun_make): New function to re-exec make. - - * make.c (construct_makeflags, construct_argv): New functions to - construct the `MAKEFLAGS' variable and to construct an arg list from - parsed info. - - * read.c (read_makefile): New arg UPDATEIT, if nonzero, says to - update the makefile as a target before reading it in. When reading - included makefiles, pass this as zero. Now returns nonzero if the - makefile was updated, zero if not. - (read_all_makefiles): Pass a nonzero UPDATEIT arg to read_makefile - for all default and -f makefiles and all makefiles from the - `MAKEFILES' variable. If any of the makefiles has changed, re-exec - self to re-read them. - - * remake.c (update_file): Print a "File `foo' up to date'" message - under -p. - - * commands.c (execute_file_commands): Allocate one byte for each of - $^ and $< rather than zero if they are to be empty. - -Fri Sep 16 13:59:59 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * Version 3.06. - - * make.c (command_switches): Fixed entry for `-o' switch. - - * make.texinfo: Renamed -c switch to -C. - - * make.c: Renamed -c switch to -C. - - * Miscellaneous de-linting. - - * read.c (record_files): Made it not free the storage for the name - if it started with `./' and was therefore not quite the same as in - the `struct file'. - - * read.c (record_files): If commands were specified twice, the error - message specifies in what files and at what line numbers. - - * make.c (main): If any of the signals we usually fatal on were - ignored by the parent (probably a shell), ignore them. - - * make.c (main): Print version info for -v, -p, or -d. - (print_data_base): Don't print version info. It will be done in main. - - * variable.c: Increased number of hash buckets to 257. - - * file.c: Increased number of hash buckets to 1007. - - * rule.c (count_implicit_rule_limits): Moved comptation of - `maxsuffix' to convert_to_pattern, since that function uses - `maxsuffix', and must be called before count_implicit_rule_limits. - - * rule.c (pattern_search): If an existent (non-intermediate) - dependendency was found via a terminal rule, set its - `tried_implicit' flag, so it will never have implicit rule search done. - - * glob.c: Bug fix to avoid alloca(0). - - * arscan.c: USG and Sun386i fixes. - -Thu Sep 15 19:40:26 1988 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * make.texinfo: Fixed some typos and spelling errors. - -Wed Sep 7 14:20:39 1988 Roland McGrath (mcgrath at helen.Berkeley.EDU) - - * make.c (decode_switches): Fixed bug wherein a bad option would - give a useless error message and loop forever. - -Tue Sep 6 14:36:02 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * make.texinfo: Documented `shell' function. - - * variable.c (expand_function): New function `shell', does - backquote-style command expansion of its arg. - - * commands.c (execute_command_line): Second arg OUTBUF, if not nil, - gets filled in with a malloc'd buffer containing the piped stdout of - the command. - (execute_file_commands): Use above (pass nil). - -Mon Sep 5 17:03:49 1988 Roland McGrath (mcgrath at hecuba.Berkeley.EDU) - - * Makefile: Added copyright notice. - Added a comment about defining `NO_MINUS_C_MINUS_O' if necessary. - - * Version 3.05. - - * rule.c (default_suffix_rules): Don't pass `-o' switches with `-c' - switches if `NO_MINUS_C_MINUS_O' is #define'd. - - * make.texinfo: Documented `GNUmakefile'. - - * read.c (read_all_makefiles): Made it try default makefile - `GNUmakefile' before others. - - * make.texinfo: Added new-style Texinfo header thingies. - -Sat Sep 3 18:09:39 1988 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * Version 3.04. - - * make.texinfo (Chained Rules): Added a @cindex about using - .PRECIOUS to preserve intermediate files. - - * remake.c (update_file_1): Made it not just return before executing - commands under -p. - - * rule.c (default_pattern_rules, default_variables): Made it use - `$(AR)' for `ar r' (to put files in archives). - - * vpath.c (build_vpath_lists): Made it recursively expand the - `VPATH' variable (by using variable_expand instead of lookup_variable). - - * read.c (conditional_line): Made it not swallow whitespace after - the comma in an `ifeq' using the `(a,b)' syntax. - - * rule.c (count_implicit_rule_limits): Made it not crash if a - pattern rule dep begins with `/'. - -Sun Aug 28 15:51:12 1988 Roland McGrath (mcgrath at homer.Berkeley.EDU) - - * make.texinfo: Clarified that the arg to the `origin' function is a - variable *name*, not a reference. - - * make.texinfo: Clarified that both -Idir and -I dir are allowed. - -Sat Aug 27 13:49:28 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * remake.c (remake_file): Made touching phonies work right. - -Wed Aug 24 20:40:48 1988 Roland McGrath (mcgrath at nutmeg.Berkeley.EDU) - - * make.texinfo: Removed reference to `RANLIB' variable. - - * Version 3.03. - - * variables.c (expand_function): Added `origin' function. - * make.texinfo: Documented same. - - * read.c (record_files): Made double-colon entries work. - -Sat Aug 20 21:09:39 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * make.c (collapse_continuations): Bug fix from RMS. - - * rule.c (install_default_pattern_rules): Made it set the - `in_use' flag of the created rules to zero, rather than letting - it be random garbage. - - * rule.c (pattern_search): Fixed putting `also make' targets into - file strucutres. - - * read.c (record_files): Fixed bug which made double-colon entries - make it read off into space. - - * make.c (decode_switches): Made it understand `ignored' switches - rather than dumping core. - -Sun Aug 14 16:49:00 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * read.c (read_makefile): Made `include' filenames be - variable-expanded. - - * read.c (read_makefile): Fixed an error message. - - * read.c (read_makefile): Made it accept ^L's as whitespace. - * make.c (next_token, end_of_token): Ditto. - - * vpath.c (vpath_search): Fixed it so that the general VPATH (from - the variable) is always checked, even if a selective VPATH (from a - directive) matched the filename. - -Sat Aug 13 14:20:46 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * make.c (decode_switches, main): Made the command switches be - processed from a table of switches, variables, and types. No - functions are passed argc and argv any more. They are passed arrays - of strings they need to process. - * read.c (read_all_makefiles): Made it take an array rather than - argc and argv. - (construct_include_path): Ditto. - - * make.c (collapse_continuations): Made it work right (I hope). - - * make.texinfo: Minor editorial changes. - - * read.c (read_makefile): Minor speed improvement by freeing and - then mallocing something rather than reallocing it to avoid the - unnecessary bcopy. - -Thu Aug 11 00:10:43 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * make.texinfo: Fixed some unquoted @'s. - - * make.texinfo: Documented multiple-target pattern rules. - Miscellaneous minor editorial changes and corrections. - - * make.texinfo (Implicit: Catalogue of Rules): Removed the list of - variables. That's what the next section is for. - (Implicit: Implicit Variables): Made it agree with reality. - -Wed Aug 10 00:55:39 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * variable.c (print_variable_data_base): Fixed bug which made -p - dump core. (This was a really idiotic bug.) - - * rule.c (pattern_search): Fixed a bug which made it make the - `also_make' member of the file in question nil if the first of - the successful rule's targets was the matching one. - Made it use only as much storage as necessary in the `also_make' - member. - (create_pattern): Made it use only as much storage as necessary in - the `lens' and `suffixes' members of the created rule. - - * remake.c (library_file_mtime): Made it `static'. - - * file.c: Added a declaration for `errno', which is declared in some - 's, but not all. - - * file.h (struct file): Added `also_make' member for multiple-target - implicit rules. - * rule.c (pattern_search): Made it put the names of files updated by - the given file's commands in its `also_make' member. - * remake.c (update_file_1): Made it mark the files in a file's - `also_make' member as updated when the file is updated. - - * variable.c (try_variable_definition): Fixed a bug which made it - define a variable with the name of the whole definition when there - was no space before the = or :=. - - * make.texinfo (Features): Made the changes which were made in RCS - revision 2.7 but somehow lost since then. Added -W. - -Tue Aug 9 10:04:50 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * variable.h: Added `o_default' to `enum variable_origin'. - * variable.c (print_variable_data_base): Made it print the origins of - the variables. - * rule.c (install_default_pattern_rules): Made it define the default - variables with origin `o_default'. - - * make.texinfo: Documented -W. - - * make.c (decode_switches, main): Added the -W flag to give files a - time-stamp of now, for a `what if' effect when used with -n. - - * commands.c (print_commands): Made it say `(built-in)' for commands - that are built into the default ruleset. - - * read.c (record_file): Made .SUFFIXES get its deps frontwards (again). - * rule.c (set_default_suffixes, convert_to_pattern): Made it read - .SUFFIXES's deps frontwards, so the converted rules will not be in - reverse order. - - * rule.c (new_pattern_rule): Fixed a bug wherein it would keep - searching after it had removed a matching rule and ended up diddling - with freed storage. - - * rule.c (freerule): Made it take the given rule off the chain. - (new_pattern_rule, count_implicit_rule_limits): Use freerule to - remove rules from the chain. - - * vpath.c (construct_vpath_list): Made it return after cleaning out - all previous searchpaths when given a nil DIRPATH arg, so it won't - go into the construction code and dump core dereferencing a nil - pointer. - - * variable.c (patsubst_expand): Fixed a bug which made it not match - correctly and sometimes dump core. - -Mon Aug 8 16:35:48 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * rule.c (default_suffix_rules): Made the .texinfo.dvi rule remove - the files used in the comparison to determine whether or not a - second TeX run is necessary. - - * make.texinfo: Fixed some overfull TeX hboxes. - - * make.texinfo (Implicit: Catalogue of Rules): Fixed a Texinfo error. - - * rule.c (create_pattern_rule): Fixed bug wherein index was not - being passed its second arg. - - * read.c (getline): Merged back into readline. - - * rule.c (default_suffixes, default_suffix_rules, - default_variables): Added .texinfo.info rule. - * make.texinfo (Implicit: Catalogue of Rules): Documented - .texinfo.dvi and .texinfo.info rules. - - * make.texinfo (Top): Changed `last updated' date to be correct (for - the last time it was updated, not today). Changed `for version - 3.00' since it's not going to be called that. - -Sat Aug 6 19:51:10 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * commands.c (print_commands): Added this function to print the - contents of a `struct commands' for -p. - * rule.c (print_rule_data_base): Use above. - * file.c (print_file_data_base): Ditto. - - * rule.c (count_implicit_rule_limits, new_pattern_rule, - install_pattern_rule, print_rule_data_base): Made it understand the - changed `struct rule' and act accordingly. - (freerule): Added this function to free all the storage used by a rule. - - * rule.c (pattern_search): Made it grok multiple targets of pattern - rules. The matching is done properly, but at present, only the - matching pattern's target is used to give deps and commands. - -Fri Aug 5 18:00:29 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * rule.c (struct rule): Changed name, namelen, and patsuffix members - to targets, lens, and suffixes, which are arrays, for multiple targets. - (create_pattern_rule): Now takes first arg TARGETS, a nil-terminated - array of targets, rather than a single target and patsuffix pointer. - - * read.c (record_files): If it finds an implicit pattern rule, it - collects all the targets into an array and passes the whole thing to - create_pattern_rule. If there are non-pattern targets, it is a - fatal error. - -Tue Aug 2 15:06:38 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * make.c (readline): Split backslash-newline checking from reading - and buffer-expanding. - (getline): Created to do the reading and buffer-expanding formerly - done in readline. - - * rule.c (pattern_search): Made it reject nonterminal match-anything - rules when a specific rule has matched, rather than rejecting - terminal match-anything rules in this case. - - * rule.c (convert_to_pattern): Fixed a bug caused when the change to - make it only recognize two-suffix rules whose target suffixes - precede their dependency suffixes which made it work in the opposite - direction (even worse than it started out). - - * rule.c (pattern_search): Made it reject nonterminal match-anything - rules as intermediate targets when searching for both real and - intermediate dependencies, rather than only when searching for - intermediate ones. - -Sun Jul 31 00:33:56 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * rule.c (convert_to_pattern): Made it only recognize two-suffix - rules whose target suffix comes before the dependency suffix in the - .SUFFIXES list. - - * variable.c (define_automatic_variables): Made all automatic - variables be defined with origin `o_automatic'. - - * variable.h: Added `o_automatic' to `enum variable_origin' - - * file.c (remove_intermediates): Made it not print an error message - if the error was that the file does not exist. - - * rule.c: Removed `recursive' member from `struct rule'. - - * remake.c (library_file_mtime): Made it not use the directory hash - functions, as reading in and hashing /usr/lib and /lib is slow and - most likely unnecessary. - - * remake.c (remake_file): Changed message from ``No specification - for making'' to ``No way to make'' so it will be short enough that - most filenames will fit on a line. - Made it look at the `recursive' member of the `struct commands', - rather than of the `struct file' (which no longer has one). - - * commands.c (execute_file_commands): Made it look at the - `recursive' member of the `struct commands', rather than of the - `struct file' (which no longer has one). - - * file.h: Removed `recursive' member from `struct file'. - - * commands.h: Added `recursive' member to `struct commands'. - - * dep.h: Removed unused `quotedparen' member from `struct nameseq' - and `struct dep'. - - * read.c (dequote): Removed this function. - (multi_glob): Removed reference to `quotedparen' member of - a `struct nameseq' and calls to dequote. - - * read.c (record_files): Made it set the stem for $* for all static - pattern rules, not just those with commands given at that time. - Removed check for recursive commands. - Made it check for pairs of .SUFFIXES dependencies to reject as - default goals as well as single ones (that don't start with dots). - (read_makefile): Added checks for recursive commands to set - the `recursive' flag in the `struct commands'. - -Sat Jul 30 15:47:23 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * make.c (find_next_token): Made the LENGTHPTR arg optionally nil. - - * make.c: Removed `files_made' variable which is defined static in - remake.c and used only there. - (main): Cleaned up somewhat. - (decode_switches): Cleaned up a bit. Made an unknown option be a - non-fatal error. - (decode_env_switches): Made LEN arg unsigned. Cleaned up. - (print_version): Made it say ``see the source'' rather than ``see - the source file'', since there is more than one. - - * file.h: Made `num_intermediates' declared unsigned. - - * file.c: Made `num_intermediates' variable unsigned. - (remove_intermediates): Removed unused FORMAT arg. - (enter_file): Made it handle double-colon files properly, adding the - new entry as the old entry's prev pointer. - - * dir.c: Re-indented the `struct dir' definition to be right. - (dir_load): Cleaned up slighty. - (file_exists_p): Removed comment saying we could use `access', since - that is a bad idea (except for setuid programs). Cleaned up slightly. - - * commands.c: Changed some comments slightly. - (execute_file_commands): Cleaned up a bit. Changed some comments, - added others. Moved freeing of storage for $^ and $? to the same - place as for the other automatic variables. - (execute_command_line): Made `#' trigger a shell. - Added some comments. Cleaned up a bit. Put all the special chars - that trigger shells into an array easily changeable at the top. - - * ar.c: Added comments explaining each function. - (ar_scan_1): Merged into ar_member_date. - (ar_member_date): Changed call to ar_scan_1 to the body of that - function. - (ar_member_date_1): Simplified to a ?: expression rather than an - if-else statement. - (ar_member_touch): Changed error handling around a bit. - None of these errors are fatal now. - - * variable.c (subst_expand): Added a new arg BY_WORD, to do substs - only on full words. - (patsubst_expand): Fixed bug which made calls whose patterns - contained no `%' to not work correctly, by using above. - (variable_expand): Pass extra arg to `subst_expand'. - - * variable.c (expand_function): Fixed bug which made `foreach' calls - with one-word lists run off into never-never land. - -Fri Jul 29 20:12:36 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * variable.c (expand_function): Made a very minor speed improvement - by avoiding an unnecessary strlen call. - -Wed Jul 27 16:01:47 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * rule.c (default_suffixes): Rearranged the list somewhat; added - `.el' and `.elc' to speed things up (especially when building - Emacs), for the same reason `.h' is there. - - * read.c (record_files): Changed `lineno' from `long' to - `unsigned int'. - -Sun Jul 24 02:15:30 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * variable.c (expand_function): Eliminated use of `wstok' - because it is non-reentrant and unreliable. - Fixed a minor bug which would cause something not to be freed. - * make.c (wstok): Removed `wstok' because it is no longer used. - - * variable.c (expand_function): Made `foreach' function put - spaces between output texts like it's supposed to. - -Sat Jul 23 17:32:55 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * rule.c (default_suffixes, default_suffix_rules): Added rule - to make %.dvi from %.texinfo. - - * dir.c (print_dir_data_base): Made it say a bit more. - -Fri Jul 22 23:13:16 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * make.c (print_data_base): Split this function up into one - for each thing. - * variable.c (print_variable_data_base): One of the above. - * rule.c (print_rule_data_base): Ditto. - * file.c (print_file_data_base): Ditto. - * dir.c (print_dir_data_base): Ditto. - - * rule.c (install_pattern_rule): Fixed a bug which caused the - terminal and recursive flags to always be zero for rules - entered by this function. - - * make.texinfo (Rules: Double-colon): Added a paragraph - explaining the purpose of double-colon rules. - - * make.texinfo (Implicit: Catalogue of Rules): Updated to - reflect new C++, TeX, Web, and Texinfo rules. Other slight - editorial changes. - - * commands.c (execute_file_commands): Fixed a bug wherein - random memory could get written for files with no deps. - -Wed Jul 20 19:30:31 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * read.c (readline): Fix bug wherein it would not recognize a - backslash-newline if the buffer filled up and was enlarged - right before reading the newline. - -Tue Jul 19 19:55:02 1988 Roland McGrath (mcgrath at chilli.Berkeley.EDU) - - * read.c: Added default suffix rules for .cc (using $(C++), - which defaults to `g++', and $(C++FLAGS)), .tex, .dvi, .web - and .cweb (using $(TEX), $(WEAVE), $(TANGLE), $(CWEAVE) and - $(CTANGLE)). - -Sat Jul 16 21:24:28 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * Made error formats use %u rather than %ld for line numbers, - which are now unsigned int's rather than long's. - - * read.c (conditional_line): Fixed some bugs caused by use of - unsigned int rather than int in one place. - - * read.c (conditional_line): Put the info about active - conditionals in a struct. - (read_makefile): Make a new struct of info about conditionals - for included makefiles and restore the old one after the - included makefile has been read. - - * read.c (read_makefile): Don't try to read a makefile with - name "" after giving an error message because an `include' - directive gave no filename. - - * read.c (read_makefile): Give an error message for - non-whitespace text after the filename in an `include' directive. - - * make.c (error): Take five args, like `fatal'. It managed to - lose with only two. Is there a better way to do this without vfprintf? - - * read.c (read_makefile): Commands consisting of only - whitespace are not the same as no commands. I thought I'd - fixed this bug months ago; it seems to have come back. - - * make.c (collapse_continuations): All whitespace around a - backslash-newline combination is turned into a single space. - - * Added COPYING file and copyright notices to all files. - - * make.texinfo (Running: Goals): Fix a typo. - - * read.c (do_define): Take an arg for the origin of the - variable being defined. - (read_makefile): Grok `override define'. - - * make.texinfo (Variables: Override Directive, Defining): - Document the `override define' combination directive. - - * ar.c (ar_member_date): Make a 0 return from `ar_scan' return - (time_t) -1 (nonexistent file), rather than (time_t) 0, which, - when put in the `struct file', makes `file_mtime' try to get - the mtime over and over again. - - * variable.c (pattern_matches): Fix a bug that made patterns - not beginning with `%' never match. - -Fri Jul 15 21:01:44 1988 Roland McGrath (mcgrath at tully.Berkeley.EDU) - - * Took Make out of RCS. - - * Split the monolithic `make.c' into several smaller files. diff --git a/src/gmake/ChangeLog.2 b/src/gmake/ChangeLog.2 deleted file mode 100644 index 49601e2a..00000000 --- a/src/gmake/ChangeLog.2 +++ /dev/null @@ -1,6633 +0,0 @@ -2000-06-22 Paul D. Smith - - * job.c (start_job_command): Increment commands_started before the - special check for ":" (empty command) to avoid spurious "is up to - date" messages. Also move the test for question_flag after we - expand arguments, and only stop if the expansion provided an - actual command to run, not just whitespace. This fixes PR/1780. - -2000-06-21 Paul D. Smith - - * read.c (read_makefile): If we find a semicolon in the target - definition, remember where it was. If the line turns out to be a - target-specific variable, add back the semicolon and everything - after it. Fixes PR/1709. - -2000-06-19 Paul D. Smith - - * config.h-vms.template: #define uintmax_t for this system. - * config.ami.template: Ditto. - * config.h.W32.template: Ditto. - - * configure.in: We don't use select(2) anymore, so don't bother - checking for it. - * acconfig.h: Ditto. - * acinclude.m4: Ditto. - - * file.c (all_secondary): New static global; if 1 it means - .SECONDARY with no prerequisites was seen in the makefile. - (snap_deps): Set it appropriately. - (remove_intermediates): Check it. - (num_intermediates): Remove this global, it's not used anywhere. - (considered): Move this to remake.c and make it static. - - * NEWS: Document the change to .SECONDARY. - * make.texinfo (Special Targets): Document the change to .SECONDARY. - - * implicit.c (pattern_search): Remove the increment of - num_intermediates; it's not used. - * filedef.h: Remove num_intermediates and considered. - - * function.c (handle_function): If the last argument was empty, we - were pretending it didn't exist rather than providing an empty - value. Keep looking until we're past the end, not just at the end. - - * implicit.c (pattern_search): Multi-target implicit rules weren't - expanding the "also made" targets correctly if the pattern didn't - contain a slash but the target did; in that case the directory - part wasn't being added back to the stem on the "also made" - targets. Reported by Seth M LaForge , with - a patch. - -2000-06-17 Eli Zaretskii - - * Makefile.DOS.template (DESTDIR, bindir, datadir, libdir) - (infodir, mandir, includedir): Support installation under a - non-default DESTDIR. - - * remake.c (f_mtime): Fix the spelling of __MSDOS__. - - * configh.DOS.template (HAVE_FDOPEN, HAVE_MKSTEMP): Define. - -2000-06-14 Paul D. Smith - - * acinclude.m4 (pds_WITH_GETTEXT): rewrite fp_WITH_GETTEXT and - rename it to avoid confusion. This version is very specific: it - won't accept any gettext that isn't GNU. If the user doesn't - explicitly ask for the included gettext, we look to see if the - system gettext is GNU (testing both the actual libintl library, - and the libintl.h header file). Only if the system gettext is - really GNU gettext will we allow it to be used. - (pds_CHECK_SYSTEM_GETTEXT): A helper function. - -2000-06-13 Paul D. Smith - - * gettext.h: If we have libintl.h, use that instead of any of the - contents of gettext.h. We won't check for libintl.h unless we're - using the system gettext. - - * function.c (func_word): Clarify error message. - -2000-06-10 Paul Eggert - - Support nanosecond resolution on hosts with 64-bit time_t and - uintmax_t (e.g. 64-bit Sparc Solaris), by splitting - FILE_TIMESTAMP into a 30-bit part for nanoseconds, with the - rest for seconds, if FILE_TIMESTAMP is at least 64 bits wide. - - * make.h: Always define FILE_TIMESTAMP to be uintmax_t, for - simplicity. - - * filedef.h (FILE_TIMESTAMP_HI_RES, FILE_TIMESTAMP_LO_BITS) - (UNKNOWN_MTIME, NONEXISTENT_MTIME, OLD_MTIME) - (ORDINARY_MTIME_MIN, ORDINARY_MTIME_MAX): New macros. - (FILE_TIMESTAMP_STAT_MODTIME): Now takes fname arg. All uses changed. - (FILE_TIMESTAMP_DIV, FILE_TIMESTAMP_MOD) - (FILE_TIMESTAMP_FROM_S_AND_NS): Remove. - (FILE_TIMESTAMP_S, FILE_TIMESTAMP_NS): Use shifts instead of - multiplication and division. Offset the timestamps by - ORDINARY_MTIME_MIN. - (file_timestamp_cons): New decl. - (NEW_MTIME): Now just the maximal timestamp value, as we no longer use - -1 to refer to nonexistent files. - - * file.c (snap_deps, print_file): Use NONEXISTENT_MTIME, - UNKNOWN_MTIME, and OLD_MTIME instead of magic constants. - * filedef.h (file_mtime_1): Likewise. - * main.c (main): Likewise. - * remake.c (update_file_1, notice_finished_file, check_dep) - (f_mtime, name_mtime, library_search): Likewise. - * vpath.c (selective_vpath_search): Likewise. - - * remake.c (f_mtime): Do not assume that (time_t) -1 equals - NONEXISTENT_MTIME. When futzing with time stamps, adjust by - multiples of 2**30, not 10**9. Do not calculate timestamp - adjustments on DOS unless they are needed. - - * commands.c (delete_target): Do not assume that - FILE_TIMESTAMP_S yields -1 for a nonexistent file, as that is - no longer true with the new representation. - - * file.c (file_timestamp_cons): New function, replacing - FILE_TIMESTAMP_FROM_S_AND_NS. All uses changed. - (file_timestamp_now): Use FILE_TIMESTAMP_HI_RES instead of 1 < - FILE_TIMESTAMPS_PER_S to determine whether we're using hi-res - timestamps. - (print_file): Print OLD_MTIME values as "very old" instead of - as a timestamp. - -2000-05-31 Paul Eggert - - * remake.c (name_mtime): Check for stat failures. Retry if EINTR. - -2000-05-24 Paul D. Smith - - * main.c (decode_switches): The "positive_int" switch uses atoi() - which succeeds for any input, and doesn't notice if extra, - non-digit text is after the number. This causes make to mis-parse - command lines like "make -j 5foo" as "make -j5" (ignoring "foo" - completely) instead of "make -j0 5foo" (where "5foo" is a - target). Fix this by checking the value by hand. We could use - strtol() if we were sure of having it; this is the only - questionable use of atoi() I found so we'll just stick with that. - Fixes PR/1716. - - * i18n/ja.po, i18n/nl.po, i18n/pt_BR.po: New translation files. - * configure.in (ALL_LINGUAS): Added pt_BR. - -2000-05-22 Paul Eggert - - * remake.c (f_mtime): Fix bug when handling future odd - timestamps in the WINDOWS32 case. Do not bother initializing - static var to zero. Simplify code that works around WINDOWS32 - and __MSDOS__ time skew brain damage. - -2000-05-22 Paul Eggert - - * job.c: Don't include time.h, as make.h already does this. - -2000-05-22 Paul Eggert - - * configure.in (AC_CHECK_HEADERS): Add sys/time.h. - (AC_HEADER_TIME): Add. - (clock_gettime): Prefer -lrt to -lposix4, for Solaris 7. - (gettimeofday): Add check for standard version of gettimeofday. - This merges changes written by Paul D. Smith. - - * file.c (file_timestamp_now): Use gettimeofday if available - and if clock_gettime does not work. Don't bother with - high-resolution clocks if file timestamps have only one-second - resolution. - - * make.h : Include, conditionally on the usual - TIME_WITH_SYS_TIME and HAVE_SYS_TIME_H macros. This is needed - for gettimeofday. - -2000-05-20 Paul D. Smith - - * read.c (read_makefile): We weren't keeping makefile names around - unless there was a rule defined in them; but now we need to keep - them for variables as well. Forget trying to be fancy: just keep - every makefile name we successfully open. - - * remote-cstms.c (start_remote_job_p): Change DB_EXTRA (?) to DB_JOBS. - -2000-05-17 Paul Eggert - - * commands.c (chop_commands): Ensure ctype macro args are nonnegative. - * expand.c (variable_expand_string): Likewise. - * function.c (subst_expand, lookup_function, msdos_openpipe): - Likewise. - * job.c (vms_redirect, start_job_command, new_job, child_execute_job, - construct_command_argv_internal, construct_command_argv): Likewise. - * main.c (decode_env_switches, quote_for_env): Likewise. - * misc.c (collapse_continuations, end_of_token, end_of_token_w32, - next_token): Likewise. - * read.c (read_makefile, do_define, conditional_line, - find_char_unquote,get_next_mword): Likewise. - * variable.c (try_variable_definition): Likewise. - * vpath.c (construct_vpath_list): Likewise. - * w32/pathstuff.c (convert_vpath_to_windows32): Likewise. - -2000-05-10 Eli Zaretskii - - * main.c (main) [__MSDOS__]: Add SIGFPE to signals we block when - running child programs, to prevent Make from dying on Windows 9X - when the child triggers an FP exception. - -2000-05-08 Paul D. Smith - - * dir.c (find_directory) [WINDOWS32]: If we strip a trailing "\" - from the directory name, remember to add it back. The argument - might really be inside a longer string (e.g. %Path%) and if you - don't restore the "\" it'll be truncated permanently. Fixes PR/1722. - Reported by - -2000-05-02 Paul D. Smith - - * job.c (construct_command_argv_internal) [WINDOWS32]: Added "rd" - and "rmdir" to the list of command.com commands. - Reported by Elod Horvath - -2000-04-24 Paul D. Smith - - * i18n/ja.po: New translation file from the Japanese language team. - -2000-04-18 Paul D. Smith - - * remake.c (f_mtime): If ar_member_date() returns -1 (the member - doesn't exist), then return (FILE_TIMESTAMP)-1 rather than - returning the timestamp calculated from the value -1. Fixes PR/1696. - Reported by Gilles Bourhis . - -2000-04-17 Paul D. Smith - - * config.h.W32.template: Add LOCALEDIR macro resolving to "". - * w32/subproc/sub_proc.c (process_begin): Remove reference to - debug_flag; change it to a DB() call. Fixes PR/1700. - Reported by Jim Smith - -2000-04-17 Bruno Haible - - * arscan.c [BeOS]: Add replacement for nonexistent from GNU - binutils. - -2000-04-11 Paul D. Smith - - * function.c (expand_builtin_function): If no arguments were - provided, just quit early rather than changing each function to - test for this. - (function_table[]): Change the min # of arguments to 0 for all - those functions for which it makes sense (currently everything - that used to take a minimum of 1 argument, except $(call ...)). - Fixes PR/1689. - -2000-04-09 Eli Zaretskii - - * README.DOS: Add instructions to install a binary distro. - Mention latest versions of Windows. - -2000-04-07 Eli Zaretskii - - * main.c (main): Rename TMP_TEMPLATE into DEFAULT_TMPDIR, and use - it for the directory of the temporary file. If P_tmpdir is - defined, use it in preference to "/tmp/". Try $TMPDIR, $TEMP, and - $TMP in the environment before defaulting to DEFAULT_TMPDIR. - (print_version): Add year 2000 to the Copyright line. - -2000-04-04 Paul D. Smith - - * Version 3.79 released. - - * make.texinfo: Update documentation with new features for 3.79. - - * function.c (func_wordlist): Don't re-order arguments to - wordlist. - -2000-04-03 Paul D. Smith - - * remake.c (f_mtime): Archive member timestamps are stored as - time_t, without nanoseconds. But, f_mtime() wants to return - nanosecond info on those systems that support it. So, convert the - return value of ar_member_date() into a FILE_TIMESTAMP, using 0 as - the nanoseconds. - -2000-03-28 Paul D. Smith - - * Version 3.78.92 released. - - * build.template: Updates for gettext support; some bugs fixed. - -2000-03-27 Paul D. Smith - - * config.guess, config.sub: Updated from config CVS archive at - :pserver:anoncvs@subversions.gnu.org:/home/cvs as of today. - - * read.c (record_files): Check if expanding a static pattern - rule's prerequisite pattern leaves an empty string as the - prerequisite, and issue an error if so. Fixes PR/1670. - (read_makefile): Store the starting linenumber for a rule in - TGTS_STARTED. - (record_waiting_files): Use the TGTS_STARTED value for the file - location passed to record_file() instead of the current - linenumber, so error messages list the line where the target was - defined instead of the line after the end of the rule definition. - - * remake.c (start_updating, finish_updating, is_updating): Fix - PR/1671; circular dependencies in double-colon rules are not - diagnosed. These macros set the updating flag in the root - double-colon file instead of the current one, if it's part of a - double-colon list. This solution provided by Tim Magill - ; I just changed the macro names :). - (update_file_1): Call them. - (check_dep): Call them. - - The change to not automatically evaluate the $(call ...) - function's arguments breaks recursive use of call. Although using - $(if ...) and $(foreach ...) in $(call ...) macros is important, - the error conditions generated are simply to obscure for me to - feel comfortable with. If a method is devised to get both - working, we'll revisit. For now, remove this change. - - * function.c (function_table): Turn on the expand bit for func_call. - (func_call): Don't expand arguments for builtin functions; that - will have already been done. - -2000-03-26 Paul D. Smith - - * file.c (remove_intermediates): Never remove targets explicitly - requested on the command-line by checking the cmd_target flag. - Fixed PR/1669. - -2000-03-23 Paul Eggert - - * filedef.h (FILE_TIMESTAMP_STAT_MODTIME): Use st_mtime instead of - st_mtim.tv_sec; the latter doesn't work on Unixware. - -2000-03-18 Paul D. Smith - - * file.c (file_hash_enter): If we're trying to change a file into - itself, just return. We used to assert this wasn't true, but - someone came up with a weird case involving archives. After - playing with it for a while I decided it was OK to ignore it. - - * default.c: Define COFLAGS to empty to avoid spurious warnings. - - * filedef.h: Change #if ST_MTIM_NSEC to #ifdef; this is a macro - containing the name of the nsec field, not true/false. - * make.h: Ditto. - Reported by Marco Franzen . - -2000-03-08 Tim Magill - - * remake.c (update_file): Return the exit status of the pruned - file when pruning, not just 0. Fixes PR/1634. - -2000-02-24 Paul D. Smith - - * configure.in: Close a minor potential security hole; if you're - reading makefiles from stdin (who does that?) you could run into a - race condition with the temp file using mktemp() or tmpnam(). Add - a check for mkstemp() and fdopen(). - * main.c (open_tmpfile): New function to open a temporary file. - If we have mkstemp() (and fdopen()), use that. If not use - mktemp() or tmpnam(). If we have fdopen(), use open() to open the - file O_CREAT|O_EXCL. If not, fall back to normal fopen() (insecure). - (main): Call it. - * job.c (child_execute_job) [VMS]: Call it. - - * variable.c (lookup_variable): If we find a variable which is - being expanded, then note it but keep looking through the rest of - the set list to see if we can find one that isn't. If we do, - return that. If we don't, return the original. Fix for PR/1610. - - While implementing this I realized that it also solves PR/1380 in - a much more elegant way. I don't know what I was smoking before. - So, remove the hackage surrounding the original fix for that (see - below). Change this function back to lookup_variable and remove - the extra setlist argument. - * variable.h (recursively_expand_setlist): Remove the macro, - rename the prototype, and remove the extra setlist argument. - (lookup_variable): Ditto. - * expand.c (recursively_expand): Rename and remove the extra - setlist argument. - (reference_variable): Use lookup_variable() again. - (allocated_variable_append): Remove the extra setlist argument. - -2000-02-21 Paul D. Smith - - * README.template: A few updates. - - * i18n/de.po: New version from the German translation team. - -2000-02-09 Paul D. Smith - - * Version 3.78.91 released. - -2000-02-07 Paul D. Smith - - * read.c (read_makefile): Reset *p2 to ':', not *colonp. If any - filenames contained backslashes the resulting output (without - backslashes) will be shorter, so setting *colonp doesn't change - the right character. Fix for PR/1586. - - For += target-specific variables we need to remember which - variable set we found the variable in, so we can start looking - from there in the next iteration (otherwise we might see it again - in recursively_expand and fail!). This is turning into a hack; if - it gets any worse we'll have to rethink this entire algorithm... - implementing expansion of these references separately from the - "normal" expansion, say, instead of using the same codepath. - Actually, it's already "worse enough" :-/. - Fix for PR/1380. - - * variable.h (recursively_expand_setlist): Rename - recursively_expand to add a struct variable_set_list argument, and - make a macro for recursively_expand. - (lookup_variable_setlist): Rename lookup_variable to add a struct - variable_set_list argument, and make a macro for lookup_variable. - - * expand.c (recursively_expand_setlist): Take an extra struct - variable_set_list argument and pass it to allocated_variable_append(). - (reference_variable): Use lookup_variable_setlist() and pass the - returned variable_set_list to recursively_expand_setlist. - (allocated_variable_append): Take an extra setlist argument and - use this as the starting place when searching for the appended - expansion. If it's null, use current_variable_set_list as before. - - * variable.c (lookup_variable_setlist): If the LISTP argument is - not nil, set it to the list containing the variable we found. - -2000-02-04 Paul D. Smith - - * variable.c (print_variable): Write out filename/linenumber - information for the variable definition if present. - (define_variable_in_set): Store filename information if provided. - (define_variable, define_variable_for_file): Removed. - (try_variable_definition): Use define_variable_loc() to keep - variable definition location information. - * read.c (read_makefile): Keep variable definition location info. - (do_define): Ditto. - (record_target_var): Ditto. - * variable.h (define_variable_in_set): New fileinfo argument. - (define_variable, define_variable_loc, define_variable_for_file): - Declare new macros. - - Fix PR/1407: - - * filedef.h (struct file): Rename patvar to pat_variables and make - it just a variable_set_list; we need our own copy of the pattern - variable's variable set list here to avoid overwriting the global - one. - * variable.c (initialize_file_variables): Move the instantiation - of the pat_variables pointer here. Only do the search after we're - done reading the makefiles so we don't search too early. If - there's a pat_variables value, set up the variables next ptr. - * expand.c (variable_expand_for_file): Remove the setup of the - pat_variables info; it's done earlier now to ensure the parent's - pattern variables are set up correctly as well. - -2000-02-03 Paul D. Smith - - * job.c (sh_chars_dos) [WINDOWS32]: Add "&" as a shell - metacharacter for the W32 DOS shell. - Reported by Warren Jones . - -2000-02-02 Paul D. Smith - - Fixes for the OpenVMS port from Hartmut Becker - - * config.h-vms [VMS]: Define LOCALEDIR to something; needed for - the expansion of bindtextdomain() even though it's a no-op. - * vmsfunctions.c (strcmpi): Remove duplicate definition of strcmpi(). - (readdir): Use DB() instead of testing debug_flag. - * dir.c (file_impossible) [VMS]: Search "p" not "name". - * job.c [VMS]: Switch from debug_flag to the new DB macro. Add - some i18n _() macros (even though VMS doesn't yet support it). - - * function.c (patsubst_expand): Change "len" to not be unsigned to - avoid type mismatches. - - * main.c (main): Declare signame_init() if we're going to call it. - -2000-01-29 Eli Zaretskii - - * Makefile.DOS.template: Track changes in Makefile.in - (install-recursive, uninstall-recursive): Add missing targets. - (DESTDIR): Define. - (install-binPROGRAMS, uninstall-binPROGRAMS): Use $(DESTDIR). - - * default.c (default_variables) [__MSDOS__]: Define CXX to gpp. - -2000-01-27 Paul D. Smith - - * gettext.c: Some warning cleanups, and a fix for systems which - don't define HAVE_ALLOCA (the workaround code was included - twice). - -2000-01-26 Paul D. Smith - - * Version 3.78.90 released. - -2000-01-25 Paul D. Smith - - Change gettext support to use the simplified version in libit 0.7. - - * getopt.c, make.h: Use gettext.h instead of libintl.h. - * ABOUT-NLS, gettext.h, gettext.c: New files from libit 0.7. - Modified to remove some static declarations which aren't defined. - * acconfig.h: Use new gettext #defines. - * acinclude.m4: Add fp_WITH_GETTEXT; remove AM_GNU_GETTEXT. - * configure.in: Call fp_WITH_GETTEXT instead. - * Makefile.am: New gettext stuff. Also force inclusion of glob - files for systems which have LIBC glob. - - * i18n/Makefile.am, i18n/.cvsignore: New dir for translation files. - * i18n/de.po, i18n/es.po, i18n/fr.po, i18n/ko.po, i18n/nl.po: - * i18n/pl.po, i18n/ru.po: Import translations already done for - earlier versions of GNU make. Thanks for that work!! - - * po/Makefile.in.in, po/POTFILES.in: Removed. - -2000-01-23 Paul D. Smith - - * main.c (decode_debug_flags): If debug_flag is set, enable all - debugging levels. - (debug_flag): Resurrect this flag variable. - (switches): Make -d give the old behavior of turning on all - debugging. Change --debug alone to emit basic debugging and take - optional arguments to expand debugging. - * NEWS: Document the new debugging options. - - * remake.c (no_rule_error): Remove this function. This tries to - fix a real problem--see the description with the introduction of - this function below. However, the cure is worse than the disease - and this approach won't work. - (remake_file): Put the code from no_rule_error back here. - (update_file_1): Remove call to no_rule_error. - - * filedef.h (struct file): Remove mfile_status field. - -2000-01-22 Paul D. Smith - - Integrate GNU gettext support. - - * configure.in: Add AM_GNU_GETTEXT. - * Makefile.am: Add options for setting LOCALEDIR, -Iintl, etc. - * acinclude.m4: Add gettext autoconf macros. - * acconfig.h: Add new gettext #defines. - * make.h: Include libintl.h. Make sure _() and N_() macros are - declared. Make gettext() an empty macro is NLS is disabled. - * main.c (struct command_switch switches[]): Can't initialize - static data with _() (gettext calls), so use N_() there then use - gettext() directly when printing the strings. - * remake.c (no_rule_error): The string constants can't be static - when initializing _() macros. - * file.c (print_file): Reformat a few strings to work better for - translation. - * po/POTFILES.in, po/Makefile.in.in: New files. Take - Makefile.in.in from the latest GNU tar distribution, as that - version works better than the one that comes with gettext. - * NEWS: Mention i18n ability. - -2000-01-21 Paul D. Smith - - Installed patches for the VMS port. - Patches provided by: Hartmut Becker - - * readme.vms, arscan.c, config.h-vms, default.c, dir.c, file.c: - * implicit.c, job.c, make.h, makefile.com, makefile.vms, rule.c: - * variable.c, vmsdir.h, vmsfunctions.c, vmsify.c, glob/glob.c: - * glob/glob.h: Installed patches. See readme.vms for details. - -2000-01-14 Andreas Schwab - - * dir.c (read_dirstream): Initialize d_type if it exists. - -2000-01-11 Paul D. Smith - - Resolve PR/xxxx: don't automatically evaluate the $(call ...) - function's arguments. While we're here, clean up argument passing - protocol to always use simple nul-terminated strings, instead of - sometimes using offset pointers to mark the end of arguments. - This change also fixes PR/1517. - Reported by Damien GIBOU . - - * function.c (struct function_table_entry): Remove the negative - required_args hack; put in explicit min and max # of arguments. - (function_table): Add in the max value. Turn off the expand bit - for func_call. - (expand_builtin_function): Test against minimum_args instead of - the obsolete required_args. - (handle_function): Rewrite this. We don't try to be fancy and - pass one style of arguments to expanded functions and another - style to non-expanded functions: pass pointers to nul-terminated - strings to all functions. - (func_call): Rewrite this. If we are invoking a builtin function - and it's supposed to have its arguments expanded, do that (since - it's not done by handle_function for $(call ...) anymore). For - non-builtins, just add the variables as before but mark them as - recursive so they'll be expanded later, as needed. - (func_if): All arguments are vanilla nul-terminated strings: - remove trickery with "argv[1]-1". - (func_foreach): Ditto. - - * expand.c (expand_argument): If the second arg is NULL, expand - the entire first argument. - - * job.c (new_job): Zero the child struct. This change was just - made to keep some heap checking software happy, not because there - was an actual bug (the important memory was being cleared properly). - -1999-12-15 Paul D. Smith - - * variable.c (print_variable): Print the variable with += if the - append flag is set. - - * implicit.c (pattern_search): Remove the extra check of the - implicit flag added on 8/24/1998. This causes problems and the - reason for the change was better resolved by the change made to - check_deps() on 1998-08-26. This fixes PR/1423. - -1999-12-08 Paul D. Smith - - * dir.c (dir_setup_glob): On 64 bit ReliantUNIX (5.44 and above) - in LFS mode, stat() is actually a macro for stat64(). Assignment - doesn't work in that case. So, stat is a macro, make a local - wrapper function to invoke it. - (local_stat): Wrapper function, if needed. - Reported by Andrej Borsenkow . - -1999-12-02 Paul D. Smith - - * remake.c (update_file): Move the considered test outside the - double-colon loop, _but_ make sure we test the double_colon target - not the "current" target. If we stop early because one - double-colon target is running, mark all the rest considered and - try to start their prerequisites (so they're marked considered). - Fix for PR/1476 suggested by Tim Magill . - -1999-11-22 Rob Tulloh - - * function.c (windows32_openpipe, func_shell): Correct Windows32 - problem where $(shell nosuchfile) would incorrectly exit make. The - fix is to print the error and let make continue. - Reported by David Masterson . - - * w32/subproc/misc.c (arr2envblk): Memory leak fix. - -1999-11-21 Paul D. Smith - - Rework GNU make debugging to provide different levels of output. - - * NEWS: mention it. - * debug.h: New file. Define various debugging levels and macros. - * function.c, implicit.c, job.c, main.c, misc.c, read.c, remake.c - * remote-cstms.c, vmsfunctions.c: Replace all code depending on - debug_flag with invocations of debugging macros. - * make.h: Remove debug_flag and DEBUGPR, add db_level. - -1999-11-18 Paul Eggert - - * acinclude.m4 (AC_SYS_LARGEFILE_FLAGS): Work around a problem - with the QNX 4.25 shell, which doesn't propagate exit status of - failed commands inside shell assignments. - -1999-11-17 Paul D. Smith - - * function.c (func_if): Find the end of the arg list by testing - the next item for NULL; any other test is not correct. - Reported by Graham Reed (PR/1429). - - Fix += when used in a target-specific variable context. - - * variable.h: New bitfield APPEND set if we have a += - target-specific variable. - - * variable.c (try_variable_definition): Add an argument to specify - if we're trying a target-specific variable. If we are and it's an - append style, don't append it, record it as normal recursive, but - set the APPEND flag so it'll be expanded later. - * main.c (handle_non_switch_argument): Use new - try_variable_definition() signature. - * read.c (read_makefile,record_target_var): Ditto. - - * expand.c (allocated_variable_append): New function: like - allocated_variable_expand(), but we expand the same variable name - in the context of the ``next'' variable set, then we append this - expanded value. - (recursively_expand): Invoke it, if the APPEND bit is set. - -1999-11-10 Paul D. Smith - - * file.c (snap_deps): If the .NOTPARALLEL target is defined, turn - off parallel builds for this make only (still allow submakes to be - run in parallel). - * main.c: New variable, ``not_parallel''. - * make.h: Add an extern for it. - * job.c (new_job): Test NOT_PARALLEL as well as JOB_SLOTS. - * NEWS: Add info on .NOTPARALLEL. - * make.texinfo (Special Targets): Document it. - - * configure.in (GLOBDIR): Set to "glob" if we need to build the - glob library. - * Makefile.am (SUBDIRS): Use the GLOBDIR variable instead of - "glob" so we don't try to build glob if we don't need to (if we - have GLIBC glob). Reported by Lars Hecking . - - * main.c (main): Don't put "***" in the clock skew warning - message. Reported by karl@gnu.org. - - * make.h: Remove unneeded signal setup. - - * signame.c: Remove extraneous #includes; some versions of Ultrix - don't protect against multiple inclusions and it causes compile - errors. Reported by Simon Burge . - -1999-10-15 Paul D. Smith - - * main.c (quote_for_env): Rename from quote_as_word(). - - * make.h, *.c: Prefer strchr() and strrchr() in the code - rather than index() and rindex(). Define strchr/strrchr in terms - of index/rindex if the former aren't supported. - - * default.c (CHECKOUT,v): Replace the fancy, complicated - patsubst/filter expression with a simple $(if ...) expression. - - * main.c (print_usage): Add the bug reporting mailing address to - the --help output, as per the GNU coding standards. - Reported by Paul Eggert . - - * README.customs: Installed information on running Customs-ized - GNU make and setuid root, collected by Ted Stern . - - * read.c (read_all_makefiles): PR/1394: Mark the end of the next - token in the MAKEFILES value string _before_ we dup it. - -1999-10-13 Paul D. Smith - - * configure.in (make_cv_sys_gnu_glob): We used to add the -Iglob - flag to CPPFLAGS, but that loses if the user specifies his own - CPPFLAGS; this one gets added _after_ his and if he happens to - have an old or broken glob.h--boom. Instead, put it in GLOBINC - and SUBST it. - - * Makefile.am (INCLUDES): Add @GLOBINC@ to the INCLUDES macro; - these things get on the compile line well before the user's - CPPFLAGS. - -1999-10-12 Paul D. Smith - - * remake.c (notice_finished_file): If we get here and -n is set, - see if all the command lines are marked recursive. If so, then we - ran every command there is, so check the mtime on this file just - like we would normally. If not, we assume the command we didn't - run would updates the target and set mtime of the target to "very new". - - * job.c (start_job_command): Update lines_flags in the file's cmds - structure with any per-line tokens we found (`@', `-', `+'). - -1999-10-08 Paul D. Smith - - * variable.c (initialize_file_variables): Always recurse to - initialize the parent's file variables: the parent might not have - any rules to run so it might not have been initialized before - this--we need this to set up the chain properly for - target-specific variables. - -1999-09-29 Paul Eggert - - * main.c (quote_as_word): Always quote for decode_env_switches - instead of for the shell, so that arguments with strange - characters are are passed to submakes correctly. Remove - double_dollars arg; we always double dollars now. All callers - changed. - (decode_env_switches): Don't run off the end of an environment - variable whose contents ends in a unescaped backslash. - -1999-09-23 Paul D. Smith - - * commands.c, function.c, job.c, read.c: Cast arguments to - ctype.h functions/macros to _unsigned_ char for portability. - - * remake.c, function.c: Compiler warning fixes: the second - argument to find_next_token() should be an _unsigned_ int*. - Reported by Han-Wen Nienhuys . - -1999-09-23 Paul D. Smith - - * Version 3.78.1 released. - - * make.texinfo: Update version/date stamp. - - * main.c (main): Argh. For some reason we were closing _all_ the - jobserver pipes before we re-exec'd due to changed makefiles. - This means that any re-exec got a "jobserver unavailable" error :-/. - I can't believe we didn't notice this before. - -1999-09-22 Paul D. Smith - - * Version 3.78 released. - - * main.c (main): Only fail on multiple --jobserver-fds options if - they aren't all the same. Some makefiles use things like - $(MAKE) $(MFLAGS) which will cause multiple, identical copies of - --jobserver-fds to show up. - -1999-09-16 Paul D. Smith - - * main.c (define_makeflags): Zero out FLAGSTRING to avoid - uninitialized memory reads when checking *p != '-' in the loop. - -1999-09-15 Paul D. Smith - - * Version 3.77.97 released. - - * configure.in (MAKE_HOST): AC_SUBST this so it will go into the - makefile. - * Makefile.am (check-local): Print a success banner if the check - succeeds. - (check-regression): A bit of fine-tuning. - -1999-09-15 Eli Zaretskii - - * README.DOS.template: Document requirements for the test suite. - * Makefile.DOS.template: Updates to allow the test suite to run - from "make check". - - * main.c (main): Handle it if argv[0] isn't an absolute path. - -1999-09-13 Paul D. Smith - - * Version 3.77.96 released. - - * Makefile.am (loadavg): Use CPPFLAGS, etc. to make sure we get - all the right #defines to compile. - (check-regression): Look for the regression test suite in the make - package itself. If we're building remotely, use symlinks to make - a local copy. - (dist-hook): Put the test suite into the tar file. - - * configure.in: Look for perl for the test suite. - -1999-09-10 Paul Eggert - - * acinclude.m4 (AC_SYS_LARGEFILE_FLAGS): If on HP-UX 10.20 or - later, and using GCC, define __STDC_EXT__; this works around a - bug in GCC 2.95.1. - -1999-09-08 Paul D. Smith - - * main.c (print_version): Ugh. GLIBC's configure tries to check - make version strings and is too aggressive with their matching - expressions. I've struck a deal with them to leave the version - output as-is for 3.78, and they'll change their configure checks - so that I can change this back in the future. - -1999-09-07 Eli Zaretskii - - * job.c (construct_command_argv_internal) [__MSDOS__]: Add "echo" - and "unset" to the list of builtin shell commands. - - * configh.DOS.template (MAKE_HOST): Define to "i386-pc-msdosdjgpp" - which is the canonical name of the DJGPP host. - -1999-09-05 Paul D. Smith - - * Version 3.77.95 released. - - * make.texinfo (Make Errors): Document some new jobserver error - messages. - -1999-09-04 Eli Zaretskii - - * make.texinfo (Make Errors): Document the hint about 8 spaces - instead of a TAB. - (Call Function, Quick Reference): Use @code{$(1)}, not @var. - - * main.c (main) [__MSDOS__]: Say "on this platform" instead of "on - MS-DOS", since the MSDOS version could run on Windows. - -1999-09-03 Paul D. Smith - - * remake.c (notice_finished_file): Always set mtime_before_update - if it's not been set, not just if we ran some rules. Otherwise we - may have a situation where a target's prerequisite was rebuilt but - not changed, so this target's rules weren't run, then - update_goal_chain() sees mtime_before_update != last_mtime and - thinks that the top-level target changed when it really didn't. - This can cause an infinite loop when remaking makefiles. - (update_goal_chain): If we get back to the top and we don't know - what the goal's last_mtime was, find it now. We need to know so - we can compare it to mtime_before_update later (this is only - crucial when remaking makefiles--should we only do it then?) - -1999-09-02 Paul D. Smith - - * read.c (read_makefile): If "override" appears as the first - prerequisite, look further to ensure this is really a - target-specific variable definition, and not just some - prerequisite named "override". - -1999-09-01 Paul D. Smith - - * function.c (IS_PATHSEP) [WINDOWS32]: Allow backslash separators - for W32 platforms. - * read.c (record_files) [WINDOWS32]: Allow backslash separators - for W32 platforms. - * implicit.c (pattern_search) [WINDOWS32]: Allow backslash - separators for W32 platforms. - - * configure.in (MAKE_HOST): Define it to be the canonical build - host info, now that we need AC_CANONICAL_HOST anyway (for large - file support). - * version.c (make_host): Define a variable to MAKE_HOST so we're - sure to get it from the local config.h. - * main.c (print_version): Use it in the version information. - * config.ami.template: Add MAKE_HOST. - * configh.dos.template: Ditto. - * config.h.W32.template: Ditto. - * config.h-vms.template: Ditto. - - * main.c (main): Close the jobserver file descriptors if we need - to re-exec ourselves. - Also print more reasonable error if users force -jN for submakes. - This may be common for a while until people use the jobserver - feature. If it happens, we ignore the existing jobserver stuff - and use whatever they specified on the commandline. - (define_makeflags): Fixed a long-standing bug: if a long name - only option comes immediately after a single letter option with no - argument, then the option string is constructed incorrectly. For - example, with -w and --jobserver-fds you get "-w-jobserver-fds..." - instead of "-w --jobserver-fds..."; add in an extra " -". - - * make.texinfo (Phony Targets): Add another example of using - .PHONY with subdirectories/recursive make. - -1999-08-30 Paul D. Smith - - * README.W32.template: Renamed from README.W32 so it's - autogenerated during the dist. A few minor modifications. - - * configure.in: Check for kstat_open before AC_FUNC_GETLOADAVG - since the latter needs to know whether the former exists to give - an accurate result. - -1999-08-26 Rob Tulloh - - * NMakefile [WINDOWS32]: Now more robust. If you change a file - under w32/subproc, the make.exe will be relinked. Also added some - tests to make sure erase commands won't fail when executed in a - pristine build environment. - - * w32/subproc/sub_proc.c [WINDOWS32]: Added support for - HAVE_CYGWIN_SHELL. If you are using the Cygwin B20.1 release, it - is now possible to have have native support for this shell without - having to rely on klutzy BATCH_MODE_ONLY_SHELL. - - * config.h.W32 [WINDOWS32]: Added HAVE_CYGWIN_SHELL macro which - users can define if they want to build make to use this shell. - - * README.W32 [WINDOWS32]: Added informaton about - HAVE_CYGWIN_SHELL. Cleaned up text a bit to make it more current. - -1999-08-26 Paul Eggert - - Support large files in AIX, HP-UX, and IRIX. - - * acinclude.m4 (AC_LFS): Remove. Superseded by AC_SYS_LARGEFILE. - (AC_SYS_LARGEFILE_FLAGS, AC_SYS_LARGEFILE_SPACE_APPEND, - AC_SYS_LARGEFILE_MACRO_VALUE, AC_SYS_LARGEFILE): New macros. - (jm_AC_TYPE_UINTMAX_T): Check for busted compilers that can't - shift or divide unsigned long long. - (AM_PROG_CC_STDC): New macro; a temporary workaround of a bug in - automake 1.4. - - * configure.in (AC_CANONICAL_HOST): Add; required by new - AC_SYS_LARGEFILE. - (AC_SYS_LARGEFILE): Renamed from AC_LFS. - (AM_PROG_CC_STDC): Add. - - * config.guess, config.sub: New files, needed for AC_CANONICAL_HOST. - -1999-08-25 Paul Eggert - - * make.h (CHAR_MAX): New macro. - * main.c (struct command_switch): c is now int, - so that it can store values greater than CHAR_MAX. - (switches): Replace small numbers N with CHAR_MAX+N-1, - to avoid problems with non-ASCII character sets. - (short_option): New macro. - (init_switches, print_usage, define_makeflags): Use it instead of - isalnum. - -1999-08-25 Paul D. Smith - - * Version 3.77.94 released. - - * main.c (main) [__MSDOS__]: If the user uses -j, warn that it's - not supported and reset it. - - * make.h (ISDIGIT): Obtained this from the textutils distribution. - * main.c (decode_switches): Use it. - * function.c (is_numeric): Use it. - - * main.c (struct command_switch): Store the switch char in an - unsigned char to shut up GCC about using it with ctype.h macros. - Besides, it _is_ always unsigned. - -1999-08-24 Paul D. Smith - - * make.texinfo: Change "dependency" to "prerequisite" and - "dependencies" to "prerequisites". Various other cleanups related - to the terminology change. - * file.c: Change debugging and error messages to use - "prerequisite" instead of "dependency". - * implicit.c: Ditto. - * remake.c: Ditto. - * NEWS: Document it. - -1999-08-23 Paul D. Smith - - * remake.c (update_file): Move the considered check into the - double-colon rule loop, so we consider double-colon rules - individually (otherwise after the first is pruned, the rest won't - get run). - - * README.template: Minor changes. - - Remove the debugging features of the jobserver, so it no longer - writes distinct tokens to the pipe. Thus, we don't need to store - the token we get. A side effect of this is to remove a potential - "unavailable token" situation: make-1 invokes make-2 with its - special token and make-3 with a normal token; make-2 completes. - Now we're waiting for make-3 but using 2 tokens; our special token - is idle. In the new version we don't have special tokens per se, - we merely decide if we already have a child or not. If we don't, - we don't need a token. If we do, we have to get one to run the - next child. Similar for putting tokens back: if we're cleaning up - the last child, we don't put a token back. Otherwise, we do. - - * main.c: Add a new, internal flag --jobserver-fds instead of - overloading the meaning of -j. Remove job_slots_str and add the - stringlist jobserver_fds. - (struct command_switch): We don't need the int_string type. - (switches[]): Add a new option for --jobserver-fds and remove - conditions around -j. Make the description for the former 0 so it - doesn't print during "make --help". - (main): Rework jobserver parsing. If we got --jobserver-fds - make sure it's valid. We only get one and job_slots must be 0. - If we're the toplevel make (-jN without --jobserver-fds) create - the pipe and write generic tokens. - Create the stringlist struct for the submakes. - Clean up the stringlist where necessary. - (init_switches): Remove int_string handling. - (print_usage): Don't print internal flags (description ptr is 0). - (decode_switches): Remove int_string handling. - (define_makeflags): Remove int_string handling. - - * job.c: Remove my_job_token flag and all references to the - child->job_token field. - (free_job_token): Remove this and merge it into free_child(). - (reap_children): Rework the "reaped a child" logic slightly. - Don't call defunct free_job_token anymore. Always call - free_child, even if we're dying. - (free_child): If we're not freeing the only child, put a token - back in the pipe. Then, if we're dying, don't bother to free. - (new_job): If we are using the jobserver, loop checking to see if - a) there are no children or b) we get a token from the pipe. - - * job.h (struct child): Remove the job_token field. - -1999-08-20 Paul D. Smith - - * variable.c (try_variable_definition): Allocate for variable - expansion in f_append with a simple variable: if we're looking at - target-specific variables we don't want to trash the buffer. - Noticed by Reiner Beninga . - -1999-08-16 Eli Zaretskii - - * main.c (main) [__MSDOS__]: Mirror any backslashes in argv[0], to - avoid problems in shell commands that use backslashes as escape - characters. - -1999-08-16 Paul D. Smith - - * Version 3.77.93 released. - -1999-08-13 Paul D. Smith - - Another jobserver algorithm change. We conveniently forgot that - the blocking bit is shared by all users of the pipe, it's not a - per-process setting. Since we have many make processes all - sharing the pipe we can't use the blocking bit as a signal handler - flag. Instead, we'll dup the pipe's read FD and have the SIGCHLD - handler close the dup'd FD. This will cause the read() to fail - with EBADF the next time we invoke it, so we know we need to reap - children. We then re-dup and reap. - - * main.c (main): Define the job_rfd variable to hold the dup'd FD. - Actually dup the read side of the pipe. Don't bother setting the - blocking bit on the file descriptor. - * make.h: Declare the job_rfd variable. - * job.c (child_handler): If the dup'd jobserver pipe is open, - close it and assign -1 to job_rfd to notify the main program that - we got a SIGCHLD. - (start_job_command): Close the dup'd FD before exec'ing children. - Since we open and close this thing so often it doesn't seem - worth it to use the close-on-exec bit. - (new_job): Remove code for testing/setting the blocking bit. - Instead of EAGAIN, test for EBADF. If the dup'd FD has been - closed, re-dup it before we reap children. - - * function.c (func_shell): Be a little more accurate about the - length of the error string to allocate. - - * expand.c (variable_expand_for_file): If there's no filenm info - (say, from a builtin command) then reset reading_file to 0. - -1999-08-09 Paul D. Smith - - * maintMakefile: Use g in sed (s///g) to replace >1 variable per - line. - - * Makefile.DOS.template [__MSDOS__]: Fix mostlyclean-aminfo to - remove the right files. - -1999-08-01 Eli Zaretskii - - * function.c (msdos_openpipe) [__MSDOS__]: *Really* return a FILE - ptr. - -1999-08-01 Paul D. Smith - - New jobserver algorithm to avoid a possible hole where we could - miss SIGCHLDs and get into a deadlock. The original algorithm was - suggested by Roland McGrath with a nice refinement by Paul Eggert. - Many thanks as well to Tim Magill and Howard Chu, who also - provided many viable ideas and critiques. We all had a fun week - dreaming up interesting ways to use and abuse UNIX syscalls :). - - Previously we could miss a SIGCHLD if it happened after we reaped - the children but before we re-entered the blocking read. If this - happened to all makes and/or all children, make would never wake - up. - - We avoid this by having the SIGCHLD handler reset the blocking bit - on the jobserver pipe read FD (normally read does block in this - algorithm). Now if the handler is called between the time we reap - and the time we read(), and there are no tokens available, the - read will merely return with EAGAIN instead of blocking. - - * main.c (main): Set the blocking bit explicitly here. - * job.c (child_handler): If we have a jobserver pipe, set the - non-blocking bit for it. - (start_waiting_job): Move the token stuff back to new_job; if we - do it here then we're not controlling the number of remote jobs - started! - (new_job): Move the check for job slots to _after_ we've created a - child structure. If the read returns without getting a token, set - the blocking bit then try to reap_children. - - * make.h (EINTR_SET): Define to test errno if EINTR is available, - or 0 otherwise. Just some code cleanup. - * arscan.c (ar_member_touch): Use it. - * function.c (func_shell): Use it. - * job.c (reap_children): Use it. - * remake.c (touch_file): Use it. - -1999-07-28 Paul D. Smith - - * make.h: Define _() and N_() macros as passthrough to initiate - NLS support. - * : Add _()/N_() around translatable strings. - -1999-07-27 Paul D. Smith - - * read.c: Make sure make.h comes before other headers. - -1999-07-26 Paul D. Smith - - * make.texinfo (Quick Reference): Update with the new features. - -1999-07-25 Eli Zaretskii - - * remake.c [__MSDOS__]: Don't include variables.h, it's already - included. - - * function.c (msdos_openpipe) [__MSDOS__]: Return FILE ptr. - (func_shell) [__MSDOS__]: Fix the argument list. - - * Makefile.DOS.template: Update from Makefile.in. - - * README.DOS.template: Configure command fixed. - - * configh.dos.template: Update to provide definitions for - uintmax_t, fd_set_size_t, and HAVE_SELECT. - -1999-07-24 Paul D. Smith - - * Version 3.77.91 released. - - * configure.in: Changes to the boostrapping code: if build.sh.in - doesn't exist configure spits an error and generates an empty - build.sh file which causes make to be confused. - * maintMakefile: Don't build README early. - -1999-07-23 Paul D. Smith - - * job.c (my_job_token): This variable controls whether we've - handed our personal token to a subprocess or not. Note we could - probably infer this from the value of job_slots_used, but it's - clearer to just keep it separately. Job_slots_used isn't really - relevant when running the job server. - (free_job_token): New function: free a job token. If we don't - have one, no-op. If we have the personal token, reclaim it. If - we have another token, write it back to the pipe. - (reap_children): Call free_job_token. - (free_child): Call free_job_token. - (start_job_command): Remove duplicate test for '+' in the command. - If we don't appear to be running a recursive make, close the - jobserver filedescriptors. - (start_waiting_job): If our personal token is available, use that - instead of going to the server pipe. - (*): Add the token value to many debugging statements, and print - the child target name in addition to the ptr hex value. - Change the default "no token" value from '\0' to '-' so it looks - better in the output. - - * main.c (main): Install the child_handler with sigaction() - instead of signal() if we have it. On SysV systems, signal() uses - SysV semantics which are a pain. But sigaction() always does what - we want. - (main): If we got job server FDs from the environment, test them - to see if they're open. If not, the parent make closed them - because it didn't think we were a submake. Print a warning and - suggestion to use "+" on the submake invocation, and hard-set to - -j1 for this instance of make. - (main): Change the algorithm for assigning slots to be more - robust. Previously make checked to see if it thought a subprocess - was a submake and if so, didn't give it a token. Since make's - don't consume tokens we could spawn many of makes fighting for a - small number of tokens. Plus this is unreliable because submakes - might not be recognized by the parent (see above) then all the - tokens could be used up by unrecognized makes, and no one could - run. Now every make consumes a token from its parent. However, - the make can also use this token to spawn a child. If the make - wants more than one, it goes to the jobserver pipe. Thus there - will never be more than N makes running for -jN, and N*2 processes - (N makes and their N children). Every make can always run at - least one job, and we'll never deadlock. (Note the closing of the - pipe for non-submakes also solves this, but this is still a better - algorithm.) So! Only put N-1 tokens into the pipe, since the - topmost make keeps one for itself. - - * configure.in: Find sigaction. Disable job server support unless - the system provides it, in addition to either waitpid() or - wait3(). - -1999-07-22 Rob Tulloh - - * arscan.c (ar_member_touch) [WINDOWS32]: The ar_date field is a - string on Windows, not a timestamp. - -1999-07-21 Paul D. Smith - - * Version 3.77.90 released. - - * Makefile.am (AUTOMAKE_OPTIONS): Require automake 1.4. - - * function.c: Rearrange so we don't need to predeclare the - function_table array; K&R C compilers don't like that. - - * acinclude.m4 (AC_FUNC_SELECT): Ouch; this requires an ANSI C - compiler! Change to work with K&R compilers as well. - - * configure.in (AC_OUTPUT): Put build.sh back. I don't know how I - thought it would work this way :-/. We'll have to think of - something else. - * Makefile.am: Remove rule to create build.sh. - - * default.c (default_suffix_rules): Rearrange the default command - lines to conform to POSIX rules (put the filename argument $< - _after_ the OUTPUT_OPTION, not before it). - - * various: Changed !strncmp() calls to strneq() macros. - - * misc.c (sindex): Make slightly more efficient. - - * dir.c (file_impossible): Change savestring(X,strlen(X)) to xstrdup(). - * implicit.c (pattern_search): Ditto. - * main.c (enter_command_line_file): Ditto. - (main): Ditto. - * misc.c (copy_dep_chain): Ditto. - * read.c (read_makefile): Ditto. - (parse_file_seq): Ditto. - (tilde_expand): Ditto. - (multi_glob): Ditto. - * rule.c (install_pattern_rule): Ditto. - * variable.c (define_variable_in_set): Ditto. - (define_automatic_variables): Ditto. - * vpath.c (construct_vpath_list): Ditto. - - * misc.c (xrealloc): Some reallocs are non-standard: work around - them in xrealloc by calling malloc if PTR is NULL. - * main.c (main): Call xrealloc() directly instead of testing for - NULL. - - * function.c (func_sort): Don't try to free NULL; some older, - non-standard versions of free() don't like it. - - * configure.in (--enable-dmalloc): Install some support for using - dmalloc (http://www.dmalloc.com/) with make. Use --enable-dmalloc - with configure to enable it. - - * function.c (function_table_entry): Whoops! The function.c - rewrite breaks backward compatibility: all text to a function is - broken into arguments, and extras are ignored. So $(sort a,b,c) - returns "a"! Etc. Ouch. Fix it by making a positive value in - the REQUIRED_ARGS field mean exactly that many arguments to the - function; any "extras" are considered part of the last argument as - before. A negative value means at least that many, but may be - more: in this case all text is broken on commas. - (handle_function): Stop when we've seen REQUIRED_ARGS args, if >0. - (expand_builtin_function): Compare number of args to the absolute - value of REQUIRED_ARGS. - -1999-07-20 Paul D. Smith - - * job.c (start_job_command): Ensure that the state of the target - is cs_running. It might not be if we skipped all the lines due to - -n (for example). - - * commands.c (execute_file_commands): If we discover that the - command script is empty and succeed early, set cs_running so the - modtime of the target is still rechecked. - - * rule.c (freerule): Free the dependency list for the rule. - - * implicit.c (pattern_search): When turning an intermediate file - into a real target, keep the also_make list. - Free the dep->name if we didn't use it during enter_file(). - -1999-07-16 Paul D. Smith - - * read.c (read_makefile): Don't allocate the commands buffer until - we're sure we found a makefile and won't return early (mem leak). - - * job.c (start_job_command): Broken #ifdef test: look for F_SETFD, - not FD_SETFD. Close-on-exec isn't getting set on the bad_stdin - file descriptor and it's leaking :-/. - * getloadavg.c (getloadavg): Ditto. - -1999-07-15 Paul D. Smith - - * read.c (read_makefile): Fix some potential memory stomps parsing - `define' directives where no variable name is given. - - * function.c (func_call): Rename from func_apply. Various code - cleanup and tightening. - (function_table): Add "call" as a valid builtin function. - - * make.texinfo (Call Function): Document it. - - * NEWS: Announce it. - -1999-07-09 Eli Zaretskii - - * variable.c (try_variable_definition) [__MSDOS__, WINDOWS32]: - Treat "override SHELL=" the same as just "SHELL=". - -1999-07-09 Paul D. Smith - - * job.c (start_waiting_job): Don't get a second job token if we - already have one; if we're waiting on the load to go down - start_waiting_job() might get called twice on the same file. - - * filedef.h (struct file): Add new field, mtime_before_update. - When notice_finished_file runs it assigns the cached last_mtime to - this field. - * remake.c (update_goal_chain): Notice that a file wasn't updated - by asking if it changed (g->changed) and comparing the current - cached time (last_mtime) with the previous one, stored in - mtime_before_update. The previous check ("did last_mtime changed - during the run of update_file?") fails for parallel builds because - last_mtime is set during reap_children, before update_file is run. - This causes update_goal_chain to always return -1 (nothing - rebuilt) when running parallel (-jN). This is OK during "normal" - builds since our caller (main) treats these cases identically in - that case, but if when rebuilding makefiles the difference is very - important, as it controls whether we re-exec or not. - * file.c (file_hash_enter): Copy the mtime_before_update field. - (snap_deps): Initialize mtime_before_update to -1. - * main.c (main): Initialize mtime_before_update on old (-o) and - new (-W) files. - -1999-07-08 Paul D. Smith - - * main.c (switches): Define a new switch -R (or - --no-builtin-variables). This option disables the defining of all - the GNU make builtin variables. - (main): If -R was given, force -r as well. - * default.c (define_default_variables): Test the new flag. - * make.h: Declare global flag. - * make.texinfo (Options Summary): Document the new option. - (Implicit Variables): Ditto. - -1999-07-06 Paul D. Smith - - * make.texinfo (Options Summary): Correct examples in - --print-data-base option summary (problem reported by David Morse - ). - - * arscan.c: Add support for archives in Windows (VC++). Frank - Libbrecht provided info on how to do - this. - * NMakefile.template (CFLAGS_any): Remove NO_ARCHIVES from the - compile line. - * build_w32.bat: Ditto. - - * remake.c (no_rule_error): Fix -include/sinclude so it doesn't - give errors if you try to -include the same file twice. - (updating_makefiles): New variable: we need to know this info in - no_rule_error() so we know whether to print an error or not. - (update_file_1): Unconditionally call no_rule_error(), don't try - to play games with the dontcare flag. - -1999-06-14 Paul D. Smith - - * make.texinfo (Remaking Makefiles): Add a description of how to - prevent implicit rule searches for makefiles. - - * make.1: Remove statement that make continues processing when -v - is given. - -1999-06-14 Paul D. Smith - - * read.c (read_makefile): Cast -1 arguments to - variable_expand_string() to long. Alexandre Sauve - reports that without casts, this breaks - on a NEC SUPER-UX SX-4 system (and it's wrong without a cast - anyway). Of course, (a) I'd really love to start using function - prototypes, and (b) there's a whole slew of issues related to int - vs. long and signed vs. unsigned in the length handling of - variable buffers, etc. Gross. Needs a complete mucking-out. - * expand.c (variable_expand): Ditto. - - * acinclude.m4 (AC_FUNC_SELECT): Slight enhancement for AIX 3.2 by - Lars Hecking . - - * read.c (get_next_mword): Allow colons to be escaped in target - names: fix for regression failure. - -1999-04-26 Paul D. Smith - - * main.c (main): Reset read_makefiles to empty after processing so - we get the right error message. - -1999-04-25 Paul D. Smith - - * make.texinfo: Updates to @dircategory and @direntry suggested by - Karl Berry . - -1999-04-23 Eli Zaretskii - - * job.c (start_job_command) [__MSDOS__]: Call unblock_sigs before - turning off dos_command_running, so child's signals produce the - right effect. - - * commands.c (fatal_error_signal) [__MSDOS__]: Use EXIT_FAILURE - instead of 1. - -1999-04-18 Eli Zaretskii - - * configh.dos.template: Update to recognize that version 2.02 of - DJGPP contains sys_siglist stuff. - -1999-04-14 Paul D. Smith - - * make.texinfo (Options/Recursion): Document the job server. - (Parallel): Tweaks. - -1999-04-13 Paul D. Smith - - Implement a new "job server" feature; the implementation was - suggested by Howard Chu . - - * configure.in (job-server): New disable option for job server - support--it's enabled by default. If it works well this will go - away. - - * NEWS: Summarize the new feature. - - * acconfig.h: New definition MAKE_JOBSERVER if job server support - is enabled. - * config.h-vms.template: Undef MAKE_JOBSERVER for this port. - * config.h.W32.template: Ditto. - * config.ami.template: Ditto. - - * main.c (struct command_switch): Add a new type: int_string. - (switches[]) Use int_string for -j if MAKE_JOBSERVER. - (init_switches): Initialize the new int_string switch type. - (print_usage): New function, extracted from decode_switches(). - (decode_switches): Call it. Decode the new int_string switch type. - (define_makeflags): Add new int_string switch data to MAKEFLAGS. - (job_fds[]) Array to contain the pipe file descriptors. - (main): Parse the job_slots_str option results. If necessary, - create the pipe and seed it with tokens. Set the non-blocking bit - for the read fd. Enable the signal handler for SIGCHLD even if we - have a non-hanging wait; it's needed to interrupt the select() in - job.c:start_waiting_job(). - - * make.h: Declare job_fds[]. - - * job.h (struct child): Add job_token field to store the token for - this job (if any). - - * job.c (reap_children): When a child is fully reaped, release the - token back into the pipe. - (free_child): If the child to be freed still has a token, put it - back. - (new_job): Initialize the job_token member. - (start_waiting_job): For local jobs, if we're using the pipe, get - a token before we check the load, etc. We do this by performing a - non-blocking read in a loop. If the read fails, no token is - available. Do a select on the fd to wait for a token. We need to - re-enable the signal handler for SIGCHLD even if we have a - non-hanging waitpid() or wait3(), so that the signal will - interrupt the select() and we can wake up to reap children. - (child_handler): Re-enable the signal handler. The count is still - kept although it's not needed or used unless you don't have - waitpid() or wait3(). - -1999-04-10 Paul D. Smith - - * main.c (main): Reset the considered bit on all the makefiles if - something failed to update; we need to examine them again if they - appear as normal targets in order to get the proper error message. - -1999-04-09 Paul D. Smith - - Performance enhancement from Tim Magill . - - * remake.c (update_file): If you have large numbers of - dependencies and you run in parallel, make can spend considerable - time each pass through the graph looking at branches it has - already seen. Since we only reap_children() when starting a pass, - not in the middle, if a branch has been seen already in that pass - nothing interesting can happen until the next pass. So, we toggle - a bit saying whether we've seen this target in this pass or not. - (update_goal_chain): Initially set the global considered toggle to - 1, since all targets initialize their boolean to 0. At the end of - each pass, toggle the global considered variable. - * filedef.h (struct file): Per-file considered toggle bit. - * file.c: New global toggle variable considered. - -1999-04-05 Paul D. Smith - - * arscan.c (ar_scan): Added support for ARFZMAG (compressed - archives?) for Digital UNIX C++. Information provided by - Patrick E. Krogel . - (ar_member_touch): Ditto. - -1999-04-03 Paul D. Smith - - * remake.c (f_mtime): If: a) we found a file and b) we didn't - create it and c) it's not marked as an implicit target and d) it - is marked as an intermediate target, then it was so marked due to - an .INTERMEDIATE special target, but it already existed in the - directory. In this case, unset the intermediate flag so we won't - delete it when make is done. It feels like it would be cleaner to - put this check in update_file_1() but I worry it'll get missed... - -1999-04-01 Paul D. Smith - - * job.c (construct_command_argv_internal): Use bcopy() to copy - overlapping strings, rather than strcpy(). ISO C says the latter - is undefined. Found this in a bug report from 1996! Ouch! - -1999-03-31 Paul D. Smith - - * read.c (readline): Ignore carriage returns at the end of the - line, to allow Windows-y CRLF line terminators. - -1999-03-30 Paul D. Smith - - * configure.in: Don't put build.sh here, since build.sh.in doesn't - exist initially. This cause autoreconf and automake to fail when - run on a clean CVS checkout. Instead, we create build.sh in the - Makefile (see below). - - * Makefile.am: Remove BUILT_SOURCES; this is no longer relevant. - Put those files directly into EXTRA_DIST so they're distributed. - Create a local build rule to create build.sh. - Create a local maintainer-clean rule to delete all the funky - maintainers files. - - * maintMakefile: Makefile.in depends on README, since automake - fails if it doesn't exist. Also don't remove glob/Makefile.in - here, as it causes problems. - -1999-03-26 Paul D. Smith - - * configure.in: Substitute GLOBLIB if we need the link the - glob/libglob.a library. - * Makefile.am (make_LDADD): Use the subst variable GLOBLIB so we - don't link the local libglob.a at all if we don't need it. - * build.template: Don't compile glob/*.o unless we want globlib. - * maintMakefile (build.sh.in): Substitute the glob/*.o files - separately. - -1999-03-25 Paul D. Smith - - * make.texinfo: Various typos and additions, pointed out by James - G. Sack . - -1999-03-22 Paul D. Smith - - * make.texinfo (Functions): Add a new section documenting the new - $(error ...) and $(warning ...) functions. Also updated copyright - dates. - * NEWS: Updated for the new functions. - * function.c (func_error): Implement the new $(error ...) and - $(warning ...) functions. - (function_table): Insert new functions into the table. - (func_firstword): Don't call find_next_token() with argv[0] - itself, since that function modifies the pointer. - * function.c: Cleanups and slight changes to the new method of - calling functions. - -1999-03-20 Han-Wen Nienhuys - - * function.c: Rewrite to use one C function per make function, - instead of a huge switch statement. Also allows some cleanup of - multi-architecture issues, and a cleaner API which makes things - like func_apply() simple. - - * function.c (func_apply): Initial implementation. Expand either - a builtin function or a make variable in the context of some - arguments, provided as $1, $2, ... $N. - -1999-03-19 Eli Zaretskii -1999-03-19 Rob Tulloh - - * job.c (construct_command_argv_internal): Don't treat _all_ - backslashes as escapes, only those which really escape a special - character. This allows most normal "\" directory separators to be - treated normally. - -1999-03-05 Paul D. Smith - - * configure.in: Check for a system strdup(). - * misc.c (xstrdup): Created. Suggestion by Han-Wen Nienhuys - . - * make.h: Prototype xstrdup(). - * remake.c (library_search): Use it. - * main.c (main): Use it. - (find_and_set_default_shell): Use it. - * job.c (construct_command_argv_internal): Use it. - * dir.c (find_directory): Use it. - - * Makefile.am, configure.in: Use AC_SUBST_FILE to insert the - maintMakefile instead of "include", to avoid automake 1.4 - incompatibility. - -1999-03-04 Paul D. Smith - - * amiga.c, amiga.h, ar.c, arscan.c, commands.c, commands.h, - * default.c, dep.h, dir.c, expand.c, file.c, filedef.h, function.c, - * implicit.c, job.c, job.h, main.c, make.h, misc.c, read.c, remake.c - * remote-cstms.c, remote-stub.c, rule.h, variable.c, variable.h, - * vpath.c, Makefile.ami, NMakefile.template, build.template, - * makefile.vms: Updated FSF address in the copyright notice. - - * variable.c (try_variable_definition): If we see a conditional - variable and we decide to set it, re-type it as recursive so it - will be expanded properly later. - -1999-02-22 Paul D. Smith - - * NEWS: Mention new .LIBPATTERNS feature. - - * make.texinfo (Libraries/Search): Describe the use and - ramifications of the new .LIBPATTERNS variable. - - * remake.c (library_search): Instead of searching only for the - hardcoded expansion "libX.a" for a library reference "-lX", we - obtain a list of patterns from the .LIBPATTERNS variable and - search those in order. - - * default.c: Added a new default variable .LIBPATTERNS. The - default for UNIX is "lib%.so lib%.a". Amiga and DOS values are - also provided. - - * read.c: Remove bogus HAVE_GLOB_H references; always include - vanilla glob.h. - -1999-02-21 Paul D. Smith - - * function.c (expand_function): Set value to 0 to avoid freeing it. - * variable.c (pop_variable_scope): Free the value of the variable. - (try_variable_definition): For simple variables, use - allocated_variable_expand() to avoid stomping on the variable - buffer when we still need it for other things. - - * arscan.c: Modified to support AIX 4.3 big archives. The changes - are based on information provided by Phil Adams - . - -1999-02-19 Paul D. Smith - - * configure.in: Check to see if the GNU glob library is already - installed on the system. If so, _don't_ add -I./glob to the - compile line. Using the system glob code with the local headers - is very bad mojo! - Rewrite SCCS macros to use more autoconf facilities. - - * Makefile.am: Move -Iglob out of INCLUDES; it'll get added to - CPPFLAGS by configure now. - Automake 1.4 introduced its own "include" feature which conflicts - with the maintMakefile stuff. A hack that seems to work is add a - space before the include :-/. - - * build.template: Move -Iglob out of the compile line; it'll get - added to CPPFLAGS by configure now. - -1999-02-16 Glenn D. Wolf - - * arscan.c (ar_scan) [VMS]: Initialized VMS_member_date before - calling lbr$get_index since if the archive is empty, - VMS_get_member_info won't get called at all, and any leftover date - will be used. This bug shows up if any member of any archive is - made, followed by a dependency check on a different, empty - archive. - -1998-12-13 Martin Zinser - - * config.h-vms [VMS]: Set _POSIX_C_SOURCE. Redefine the getopt - functions so we don't use the broken VMS versions. - * makefile.com [VMS]: Allow debugging. - * dir.c (dir_setup_glob) [VMS]: Don't extern stat() on VMS. - -1998-11-30 Paul D. Smith - - * signame.c (init_sig): Check the sizes of signals being set up to - avoid array overwrites (if the system headers have problems). - -1998-11-17 Paul D. Smith - - * read.c (record_files): Clean up some indentation. - -1998-11-08 Han-Wen Nienhuys - - * rule.c (print_rule_data_base): Fix arguments to fatal() call. - -1998-10-13 Paul D. Smith - - * job.c (start_job_command): If the command list resolves to no - chars at all (e.g.: "foo:;$(empty)") then command_ptr is NULL; - quit early. - -1998-10-12 Andreas Schwab - - * rule.c (print_rule_data_base): Ignore num_pattern_rules if it is - zero. - -1998-10-09 Paul D. Smith - - * read.c (read_makefile): Allow non-empty lines to expand to the - empty string after variable, etc., expansion, and be ignored. - -1998-09-21 Paul D. Smith - - * job.c (construct_command_argv_internal): Only add COMMAND.COM - "@echo off" line for non-UNIXy shells. - -1998-09-09 Paul D. Smith - - * w32/subproc/sub_proc.c: Add in missing HAVE_MKS_SHELL tests. - -1998-09-04 Paul D. Smith - - * read.c (read_makefile): If we hit the "missing separator" error, - check for the common case of 8 spaces instead of a TAB and give an - extra comment to help people out. - -1998-08-29 Paul Eggert - - * configure.in (AC_STRUCT_ST_MTIM_NSEC): - Renamed from AC_STRUCT_ST_MTIM. - - * acinclude.m4 (AC_STRUCT_ST_MTIM_NSEC): Likewise. - Port to UnixWare 2.1.2 and pedantic Solaris 2.6. - - * acconfig.h (ST_MTIM_NSEC): - Renamed from HAVE_ST_MTIM, with a new meaning. - - * filedef.h (FILE_TIMESTAMP_FROM_S_AND_NS): - Use new ST_MTIM_NSEC macro. - -1998-08-26 Paul D. Smith - - * remake.c (check_dep): For any intermediate file, not just - secondary ones, try implicit and default rules if no explicit - rules are given. I'm not sure why this was restricted to - secondary rules in the first place. - -1998-08-24 Paul D. Smith - - * make.texinfo (Special Targets): Update documentation for - .INTERMEDIATE: if used with no dependencies, then it does nothing; - old docs said it marked all targets as intermediate, which it - didn't... and which would be silly :). - - * implicit.c (pattern_search): If we find a dependency in our - internal tables, make sure it's not marked intermediate before - accepting it as a found_file[]. - -1998-08-20 Paul D. Smith - - * ar.c (ar_glob): Use existing alpha_compare() with qsort. - (ar_glob_alphacompare): Remove it. - - Modify Paul Eggert's patch so we don't abandon older systems: - - * configure.in: Warn the user if neither waitpid() nor wait3() is - available. - - * job.c (WAIT_NOHANG): Don't syntax error on ancient hosts. - (child_handler, dead_children): Define these if WAIT_NOHANG is not - available. - (reap_children): Only track the dead_children count if no - WAIT_NOHANG. Otherwise, it's a boolean. - - * main.c (main): Add back signal handler if no WAIT_NOHANG is - available; only use default signal handler if it is. - -1998-08-20 Paul Eggert - - Install a more robust signal handling mechanism for systems which - support it. - - * job.c (WAIT_NOHANG): Define to a syntax error if our host - is truly ancient; this should never happen. - (child_handler, dead_children): Remove. - (reap_children): Don't try to keep separate track of how many - dead children we have, as this is too bug-prone. - Just ask the OS instead. - (vmsHandleChildTerm): Fix typo in error message; don't mention - child_handler. - - * main.c (main): Make sure we're not ignoring SIGCHLD/SIGCLD; - do this early, before we could possibly create a subprocess. - Just use the default behavior; don't have our own handler. - -1998-08-18 Eli Zaretskii - - * read.c (read_makefile) [__MSDOS__, WINDOWS32]: Add code to - recognize library archive members when dealing with drive spec - mess. Discovery and initial fix by George Racz . - -1998-08-18 Paul D. Smith - - * configure.in: Check for stdlib.h explicitly (some hosts have it - but don't have STDC_HEADERS). - * make.h: Use HAVE_STDLIB_H. Clean up some #defines. - * config.ami: Re-compute based on new config.h.in contents. - * config.h-vms: Ditto. - * config.h.W32: Ditto. - * configh.dos: Ditto. - - * dir.c (find_directory) [WINDOWS32]: Windows stat() fails if - directory names end with `\' so strip it. - -1998-08-17 Paul D. Smith - - * make.texinfo: Added copyright year to the printed copy. Removed - the price from the manual. Change the top-level reference to - running make to be "Invoking make" instead of "make Invocation", - to comply with GNU doc standards. - - * make.h (__format__, __printf__): Added support for these in - __attribute__ macro. - (message, error, fatal): Use ... prototype form under __STDC__. - Add __format__ attributes for printf-style functions. - - * configure.in (AC_FUNC_VPRINTF): Check for vprintf()/_doprnt(). - - * misc.c (message, error, fatal): Add preprocessor stuff to enable - creation of variable-argument functions with appropriate - prototypes, that works with ANSI, pre-ANSI, varargs.h, stdarg.h, - v*printf(), _doprnt(), or none of the above. Culled from GNU - fileutils and slightly modified. - (makefile_error, makefile_error): Removed (merged into error() and - fatal(), respectively). - * amiga.c: Use them. - * ar.c: Use them. - * arscan.c: Use them. - * commands.c: Use them. - * expand.c: Use them. - * file.c: Use them. - * function.c: Use them. - * job.c: Use them. - * main.c: Use them. - * misc.c: Use them. - * read.c: Use them. - * remake.c: Use them. - * remote-cstms.c: Use them. - * rule.c: Use them. - * variable.c: Use them. - - * make.h (struct floc): New structure to store file location - information. - * commands.h (struct commands): Use it. - * variable.c (try_variable_definition): Use it. - * commands.c: Use it. - * default.c: Use it. - * file.c: Use it. - * function.c: Use it. - * misc.c: Use it. - * read.c: Use it. - * rule.c: Use it. - -1998-08-16 Paul Eggert - - * filedef.h (FILE_TIMESTAMP_PRINT_LEN_BOUND): Add 10, for nanoseconds. - -1998-08-16 Paul Eggert - - * filedef.h (FLOOR_LOG2_SECONDS_PER_YEAR): New macro. - (FILE_TIMESTAMP_PRINT_LEN_BOUND): Tighten bound, and try to - make it easier to understand. - -1998-08-14 Paul D. Smith - - * read.c (read_makefile): We've already unquoted any colon chars - by the time we're done reading the targets, so arrange for - parse_file_seq() on the target list to not do so again. - -1998-08-05 Paul D. Smith - - * configure.in: Added glob/configure.in data. We'll have the glob - code include the regular make config.h, rather than creating its - own. - - * getloadavg.c (main): Change return type to int. - -1998-08-01 Paul Eggert - - * job.c (reap_children): Ignore unknown children. - -1998-07-31 Paul D. Smith - - * make.h, filedef.h, dep.h, rule.h, commands.h, remake.c: - Add prototypes for functions. Some prototypes needed to be moved - in order to get #include order reasonable. - -1998-07-30 Paul D. Smith - - * make.h: Added MIN/MAX. - * filedef.h: Use them; remove FILE_TIMESTAMP_MIN. - -1998-07-30 Paul Eggert - - Add support for sub-second timestamp resolution on hosts that - support it (just Solaris 2.6, so far). - - * acconfig.h (HAVE_ST_MTIM, uintmax_t): New undefs. - * acinclude.m4 (jm_AC_HEADER_INTTYPES_H, AC_STRUCT_ST_MTIM, - jm_AC_TYPE_UINTMAX_T): New defuns. - * commands.c (delete_target): Convert file timestamp to - seconds before comparing to archive timestamp. Extract mod - time from struct stat using FILE_TIMESTAMP_STAT_MODTIME. - * configure.in (C_STRUCT_ST_MTIM, jm_AC_TYPE_UINTMAX_T): Add. - (AC_CHECK_LIB, AC_CHECK_FUNCS): Add clock_gettime. - * file.c (snap_deps): Use FILE_TIMESTAMP, not time_t. - (file_timestamp_now, file_timestamp_sprintf): New functions. - (print_file): Print file timestamps as FILE_TIMESTAMP, not - time_t. - * filedef.h: Include if available and if HAVE_ST_MTIM. - (FILE_TIMESTAMP, FILE_TIMESTAMP_STAT_MODTIME, FILE_TIMESTAMP_MIN, - FILE_TIMESTAMPS_PER_S, FILE_TIMESTAMP_FROM_S_AND_NS, - FILE_TIMESTAMP_DIV, FILE_TIMESTAMP_MOD, FILE_TIMESTAMP_S, - FILE_TIMESTAMP_NS, FILE_TIMESTAMP_PRINT_LEN_BOUND): New macros. - (file_timestamp_now, file_timestamp_sprintf): New decls. - (struct file.last_mtime, f_mtime, file_mtime_1, NEW_MTIME): - time_t -> FILE_TIMESTAMP. - * implicit.c (pattern_search): Likewise. - * vpath.c (vpath_search, selective_vpath_search): Likewise. - * main.c (main): Likewise. - * remake.c (check_dep, name_mtime, library_search, f_mtime): Likewise. - (f_mtime): Use file_timestamp_now instead of `time'. - Print file timestamp with file_timestamp_sprintf. - * vpath.c (selective_vpath_search): Extract file time stamp from - struct stat with FILE_TIMESTAMP_STAT_MODTIME. - -1998-07-28 Paul D. Smith - - * Version 3.77 released. - - * dosbuild.bat: Change to DOS CRLF line terminators. - - * make-stds.texi: Update from latest version. - - * make.texinfo (Options Summary): Clarify that the -r option - affects only rules, not builtin variables. - -1998-07-27 Paul D. Smith - - * make.h: Make __attribute__ resolve to empty for non-GCC _and_ - for GCC pre-2.5.x. - - * misc.c (log_access): Print UID/GID's as unsigned long int for - maximum portability. - - * job.c (reap_children): Print PIDs as long int for maximum - portability. - -1998-07-24 Eli Zaretskii - - * Makefile.DOS (*_INSTALL, *_UNINSTALL): Replace `true' with `:'. - -1998-07-25 Paul D. Smith - - * Version 3.76.94 released. - -1998-07-23 Paul D. Smith - - * config.h.W32.template: Make sure all the #defines of macros here - have a value (e.g., use ``#define HAVE_STRING_H 1'' instead of - just ``#define HAVE_STRING_H''. Keeps the preprocessor happy in - some contexts. - - * make.h: Remove __attribute__((format...)) stuff; using it with - un-prototyped functions causes older GCC's to fail. - - * Version 3.76.93 released. - -1998-07-22 Paul D. Smith - - * file.c (print_file_data_base): Fix average calculation. - -1998-07-20 Paul D. Smith - - * main.c (die): Postpone the chdir() until after - remove_intermediates() so that intermediate targets with relative - pathnames are removed properly. - -1998-07-17 Paul D. Smith - - * filedef.h (struct file): New flag: did we print an error or not? - - * remake.c (no_rule_error): New function to print error messages, - extraced from remake_file(). - - * remake.c (remake_file): Invoke the new error print function. - (update_file_1): Invoke the error print function if we see that we - already tried this target and it failed, but that an error wasn't - printed for it. This can happen if a file is included with - -include or sinclude and couldn't be built, then later is also - the dependency of another target. Without this change, make just - silently stops :-/. - -1998-07-16 Paul D. Smith - - * make.texinfo: Removed "beta" version designator. - Updated ISBN for the next printing. - -1998-07-13 Paul Eggert - - * acinclude.m4: New AC_LFS macro to determine if special compiler - flags are needed to allow access to large files (e.g., Solaris 2.6). - * configure.in: Invoke it. - -1998-07-08 Eli Zaretskii - - * Makefile.DOS: track changes in Makefile.in. - -1998-07-07 Paul D. Smith - - * remote-cstms.c (start_remote_job): Move gethostbyaddr() to the - top so host is initialized early enough. - - * acinclude.m4: New file. Need some special autoconf macros to - check for network libraries (-lsocket, -lnsl, etc.) when - configuring Customs. - - * configure.in (make_try_customs): Invoke new network libs macro. - -1998-07-06 Paul D. Smith - - * Version 3.76.92 released. - - * README.customs: Added to the distribution. - - * configure.in (make_try_customs): Rewrite to require an installed - Customs library, rather than looking at the build directory. - - * Makefile.am (man_MANS): Install make.1. - * make.1: Renamed from make.man. - - * make.texinfo (Bugs): New mailing list address for GNU make bug - reports. - -1998-07-02 Paul D. Smith - - * Version 3.76.91 released. - - * default.c: Added default rule for new-style RCS master file - storage; ``% :: RCS/%''. - Added default rules for DOS-style C++ files with suffix ".cpp". - They use the new LINK.cpp and COMPILE.cpp macros, which are set by - default to be equal to LINK.cc and COMPILE.cc. - -1998-06-19 Eli Zaretskii - - * job.c (start_job_command): Reset execute_by_shell after an empty - command was skipped. - -1998-06-09 Paul D. Smith - - * main.c (main): Keep track of the temporary filename created when - reading a makefile from stdin (-f-) and attempt to remove it - as soon as we know we're not going to re-exec. If we are, add it - to the exec'd make's cmd line with "-o" so the exec'd make doesn't - try to rebuild it. We still have a hole: if make re-execs then - the temporary file will never be removed. To fix this we'd need - a brand new option that meant "really delete this". - * AUTHORS, getopt.c, getopt1.c, getopt.h, main.c (print_version): - Updated mailing addresses. - -1998-06-08 Paul D. Smith - - * main.c (main): Andreas Luik points out that the - check for makefile :: rules with commands but no dependencies - causing a loop terminates incorrectly. - - * maintMakefile: Make a template for README.DOS to update version - numbers. - -1998-05-30 Andreas Schwab - - * remake.c (update_file_1): Don't free the memory for the - dependency structure when dropping a circular dependency. - -1998-05-30 Eli Zaretskii - - * dir.c (file_exists_p, file_impossible_p, file_impossible) - [__MSDOS__, WINDOWS32]: Retain trailing slash in "d:/", and make - dirname of "d:foo" be "d:". - -1998-05-26 Andreas Schwab - - * read.c (read_makefile): Avoid running past EOS when scanning - file name after `include'. - -1998-05-26 Andreas Schwab - - * make.texinfo (Flavors): Correct description of conditional - assignment, which is not equivalent to ifndef. - (Setting): Likewise. - -1998-05-24 Paul D. Smith - - * arscan.c (ar_name_equal): strncmp() might be implemented as a - macro, so don't put preprocessor conditions inside the arguments - list. - -1998-05-23 Eli Zaretskii - - * read.c (read_makefile) [__MSDOS__, WINDOWS32]: Skip colons in - drive specs when parsing targets, target-specific variables and - static pattern rules. A colon can only be part of drive spec if - it is after the first letter in a token. - -1998-05-22 Eli Zaretskii - - * remake.c (f_mtime) [__MSDOS__]: Allow up to 3 sec of skew before - yelling bloody murder. - - * dosbuild.bat: Use -DINCLUDEDIR= and -DLIBDIR= where appropriate. - - * read.c (parse_file_seq): Combine the special file-handling code - for WINDOWS32 and __MSDOS__ into a single snippet. - (get_next_mword) [__MSDOS__, WINDOWS32]: Allow a word to include a - colon as part of a drive spec. - - * job.c (batch_mode_shell) [__MSDOS__]: Declare. - -1998-05-20 Paul D. Smith - - * Version 3.76.90 released. - -1998-05-19 Paul D. Smith - - * make.texinfo (Make Errors): Added a new appendix describing - common errors make might generate and how to resolve them (or at - least more information on what they mean). - - * maintMakefile (NMAKEFILES): Use the new automake 1.3 feature - to create a dependency file to construct Makefile.DOS, SMakefile, - and NMakefile. - (.dep_segment): Generate the dependency fragment file. - -1998-05-14 Paul D. Smith - - * make.man: Minor changes. - -1998-05-13 Paul D. Smith - - * function.c (pattern_matches,expand_function): Change variables - and types named "word" to something else, to avoid compilation - problems on Cray C90 Unicos. - * variable.h: Modify the function prototype. - -1998-05-11 Rob Tulloh - - * job.c (construct_command_argv_internal) [WINDOWS32]: Turn off - echo when using a batch file, and make sure the command ends in a - newline. - -1998-05-03 Paul D. Smith - - * configure.in (make_try_customs): Add some customs flags if the - user configures custom support. - - * job.c, remote-cstms.c: Merge in changes for custom library. - - * remote-stub.c: Add option to stub start_remote_job_p(). - -1998-05-01 Paul D. Smith - - * remake.c (f_mtime): Install VPATH+ handling for archives; use - the hname field instead of the name field, and rehash when - appropriate. - -1998-04-30 Paul D. Smith - - * rule.c (print_rule_data_base): Print out any pattern-specific - variable values into the rules database. - - * variable.c (print_variable_set): Make this variable extern, to - be called by print_rule_data_base() for pattern-specific variables. - - * make.texinfo (Pattern-specific): Document pattern-specific - variables. - -1998-04-29 Paul D. Smith - - * expand.c (variable_expand_for_file): Make static; its only - called internally. Look up this target in the list of - pattern-specific variables and insert the variable set into the - queue to be searched. - - * filedef.h (struct file): Add a new field to hold the - previously-found pattern-specific variable reference. Add a new - flag to remember whether we already searched for this file. - - * rule.h (struct pattern_var): New structure for storing - pattern-specific variable values. Define new function prototypes. - - * rule.c: New variables pattern_vars and last_pattern_var for - storage and handling of pattern-specific variable values. - (create_pattern_var): Create a new pattern-specific variable value - structure. - (lookup_pattern_var): Try to match a target to one of the - pattern-specific variable values. - -1998-04-22 Paul D. Smith - - * make.texinfo (Target-specific): Document target-specific - variables. - -1998-04-21 Paul D. Smith - - * variable.c (define_variable_in_set): Made globally visible. - (lookup_variable_in_set): New function: like lookup_variable but - look only in a specific variable set. - (target_environment): Use lookup_variable_in_set() to get the - correct export rules for a target-specific variable. - (create_new_variable_set): Create a new variable set, and just - return it without installing it anywhere. - (push_new_variable_scope): Reimplement in terms of - create_new_variable_set. - - * read.c (record_target_var): Like record_files, but instead of - files create a target-specific variable value for each of the - listed targets. Invoked from read_makefile() when the target line - turns out to be a target-specific variable assignment. - -1998-04-19 Paul D. Smith - - * read.c (read_makefile): Rewrite the entire target parsing - section to implement target-specific variables. In particular, we - cannot expand the entire line as soon as it's read in, since we - may want to evaluate parts of it with different variable contexts - active. Instead, start expanding from the beginning until we find - the `:' (or `::'), then determine what kind of line this is and - continue appropriately. - - * read.c (get_next_mword): New function to parse a makefile line - by "words", considering an entire variable or function as one - word. Return the type read in, along with its starting position - and length. - (enum make_word_type): The types of words that are recognized by - get_next_mword(). - - * variable.h (struct variable): Add a flag to specify a per-target - variable. - - * expand.c: Make variable_buffer global. We need this during the - new parsing of the makefile. - (variable_expand_string): New function. Like variable_expand(), - but start at a specific point in the buffer, not the beginning. - (variable_expand): Rewrite to simply call variable_expand_string(). - -1998-04-13 Paul D. Smith - - * remake.c (update_goal_chain): Allow the rebuilding makefiles - step to use parallel jobs. Not sure why this was disabled: - hopefully we won't find out :-/. - -1998-04-11 Paul D. Smith - - * main.c (main): Set the CURDIR makefile variable. - * make.texinfo (Recursion): Document it. - -1998-03-17 Paul D. Smith - - * misc.c (makefile_fatal): If FILE is nil, invoke plain fatal(). - * variable.c (try_variable_definition): Use new feature. - -1998-03-10 Paul D. Smith - - * main.c (main): Don't pass included, rebuilt makefiles to - re-exec'd makes with -o. Reopens a possible loop, but it caused - too many problems. - -1998-03-02 Paul D. Smith - - * variable.c (try_variable_definition): Implement ?=. - * make.texinfo (Setting): Document it. - -1998-02-28 Eli Zaretskii - - * job.c (start_job_command): Reset execute_by_shell after an empty - command, like ":", has been seen. - -Tue Oct 07 15:00:00 1997 Phil Brooks - - * make.h [WINDOWS32]: make case sensitivity configurable - * dir.c [WINDOWS32]: make case sensitivity configurable - * README.W32: Document case sensitivity - * config.ami: Share case warping code with Windows - -Mon Oct 6 18:48:45 CDT 1997 Rob Tulloh - - * w32/subproc/sub_proc.c: Added support for MKS toolkit shell - (turn on HAVE_MKS_SHELL). - * read.c [WINDOWS32]: Fixed a problem with multiple target rules - reported by Gilbert Catipon (gcatipon@tibco.com). If multiple - path tokens in a rule did not have drive letters, make would - incorrectly concatenate the 2 tokens together. - * main.c/variable.c [WINDOWS32]: changed SHELL detection code to - follow what MSDOS did. In addition to watching for SHELL variable - updates, make's main will attempt to default the value of SHELL - before and after makefiles are parsed. - * job.c/job.h [WINDOWS32]: The latest changes made to enable use - of the GNUWIN32 shell from make could cause make to fail due to a - concurrency condition between parent and child processes. Make - now creates a batch file per job instead of trying to reuse the - same singleton batch file. - * job.c/job.h/function.c/config.h.W32 [WINDOWS32]: Renamed macro - from HAVE_CYGNUS_GNUWIN32_TOOLS to BATCH_MODE_ONLY_SHELL. Reworked - logic to reduce complexity. WINDOWS32 now uses the unixy_shell - variable to detect Bourne-shell compatible environments. There is - also a batch_mode_shell variable that determines whether not - command lines should be executed via script files. A WINDOWS32 - system with no sh.exe installed would have unixy_shell set to - FALSE and batch_mode_shell set to TRUE. If you have a unixy shell - that does not behave well when invoking things via 'sh -c xxx', - you may want to turn on BATCH_MODE_ONLY_SHELL and see if things - improve. - * NMakefile: Added /D DEBUG to debug build flags so that unhandled - exceptions could be debugged. - -Mon Oct 6 00:04:25 1997 Rob Tulloh - - * main.c [WINDOWS32]: The function define_variable() does not - handle NULL. Test before calling it to set Path. - * main.c [WINDOWS32]: Search Path again after makefiles have been - parsed to detect sh.exe. - * job.c [WINDOWS32]: Added support for Cygnus GNU WIN32 tools. - To use, turn on HAVE_CYGNUS_GNUWIN32_TOOLS in config.h.W32. - * config.h.W32: Added HAVE_CYGNUS_GNUWIN32_TOOLS macro. - -Sun Oct 5 22:43:59 1997 John W. Eaton - - * glob/glob.c (glob_in_dir) [VMS]: Globbing shouldn't be - case-sensitive. - * job.c (child_execute_job) [VMS]: Use a VMS .com file if the - command contains a newline (e.g. from a define/enddef block). - * vmsify.c (vmsify): Return relative pathnames wherever possible. - * vmsify.c (vmsify): An input string like "../.." returns "[--]". - -Wed Oct 1 15:45:09 1997 Rob Tulloh - - * NMakefile: Changed nmake to $(MAKE). - * subproc.bat: Take the make command name from the command - line. If no command name was given, default to nmake. - * job.c [MSDOS, WINDOWS32]: Fix memory stomp: temporary file names - are now always created in heap memory. - * w32/subproc/sub_proc.c: New implementation of make_command_line() - which is more compatible with different Bourne shell implementations. - Deleted the now obsolete fix_command_line() function. - * main.c [WINDOWS32]: Any arbitrary spelling of Path can be - detected. Make will ensure that the special spelling `Path' is - inserted into the environment when the path variable is propagated - within itself and to make's children. - * main.c [WINDOWS32]: Detection of sh.exe was occurring too - soon. The 2nd check for the existence of sh.exe must come after - the call to read_all_makefiles(). - -Fri Sep 26 01:14:18 1997 - - * makefile.com [VMS]: Fixed definition of sys. - * readme.vms: Comments on what's changed lately. - -Fri Sep 26 01:14:18 1997 John W. Eaton - - * read.c (read_all_makefiles): Allow make to find files named - "MAKEFILE" with no extension on VMS. - * file.c (lookup_file): Lowercase filenames on VMS. - -1997-09-29 Paul D. Smith - - * read.c (read_makefile): Reworked target detection again; the old - version had an obscure quirk. - -Fri Sep 19 09:20:49 1997 Paul D. Smith - - * Version 3.76.1 released. - - * Makefile.am: Add loadavg files to clean rules. - - * configure.in (AC_OUTPUT): Remove stamp-config; no longer needed. - * Makefile.ami (distclean): Ditto. - * SMakefile (distclean): Ditto. - - * main.c (main): Arg count should be int, not char! Major braino. - -Tue Sep 16 10:18:22 1997 Paul D. Smith - - * Version 3.76 released. - -Tue Sep 2 10:07:39 1997 Paul D. Smith - - * function.c (expand_function): When processing $(shell...) - translate a CRLF (\r\n) sequence as well as a newline (\n) to a - space. Also remove an ending \r\n sequence. - * make.texinfo (Shell Function): Document it. - -Fri Aug 29 12:59:06 1997 Rob Tulloh - - * w32/pathstuff.c (convert_Path_to_windows32): Fix problem where - paths which contain single character entries like `.' are not - handled correctly. - - * README.W32: Document path handling issues on Windows systems. - -Fri Aug 29 02:01:27 1997 Paul D. Smith - - * Version 3.75.93. - -Thu Aug 28 19:39:06 1997 Rob Tulloh - - * job.c (exec_command) [WINDOWS32]: If exec_command() is invoked - from main() to re-exec make, the call to execvp() would - incorrectly return control to parent shell before the exec'ed - command could run to completion. I believe this is a feature of - the way that execvp() is implemented on top of WINDOWS32 APIs. To - alleviate the problem, use the supplied process launch function in - the sub_proc library and suspend the parent process until the - child process has run. When the child exits, exit the parent make - with the exit code of the child make. - -Thu Aug 28 17:04:47 1997 Paul D. Smith - - * Makefile.DOS.template (distdir): Fix a line that got wrapped in - email. - - * Makefile.am (loadavg): Give the necessary cmdline options when - linking loadavg. - - * configure.in: Check for pstat_getdynamic for getloadvg on HP. - - * job.c (start_job_command) [VMS, _AMIGA]: Don't perform empty - command optimization on these systems; it doesn't make sense. - -Wed Aug 27 17:09:32 1997 Paul D. Smith - - * Version 3.75.92 - -Tue Aug 26 11:59:15 1997 Paul D. Smith - - * main.c (print_version): Add '97 to copyright years. - - * read.c (do_define): Check the length of the array before looking - at a particular offset. - - * job.c (construct_command_argv_internal): Examine the last byte - of the previous arg, not the byte after that. - -Sat Aug 23 1997 Eli Zaretskii - - * Makefile.DOS.template: New file (converted to Makefile.DOS in - the distribution). - - * configure.bat: Rewrite to use Makefile.DOS instead of editing - Makefile.in. Add support for building from outside of the source - directory. Fail if the environment block is too small. - - * configh.dos: Use . - - * README.DOS: Update instructions. - -Fri Aug 22 1997 Eli Zaretskii - - * job.c (start_job_command) [__MSDOS__]: Don't test for "/bin/sh" - literally, use value of unixy_shell instead. - - * filedef.h (NEW_MTIME): Use 1 less than maximum possible value if - time_t is unsigned. - -Sat Aug 16 00:56:15 1997 John W. Eaton - - * vmsify.c (vmsify, case 11): After translating `..' elements, set - nstate to N_OPEN if there are still more elements to process. - (vmsify, case 2): After translating `foo/bar' up to the slash, - set nstate to N_OPEN, not N_DOT. - -Fri Aug 8 15:18:09 1997 John W. Eaton - - * dir.c (vmsstat_dir): Leave name unmodified on exit. - * make.h (PATH_SEPARATOR_CHAR): Set to comma for VMS. - * vpath.c: Fix comments to refer to path separator, not colon. - (selective_vpath_search): Avoid Unixy slash handling for VMS. - -Thu Aug 7 22:24:03 1997 John W. Eaton - - * ar.c [VMS]: Don't declare ar_member_touch. - Delete VMS version of ar_member_date. - Enable non-VMS versions of ar_member_date and ar_member_date_1 for - VMS too. - * arscan.c (VMS_get_member_info): New function. - (ar_scan): Provide version for VMS systems. - (ar_name_equal): Simply compare name and mem on VMS systems. - Don't define ar_member_pos or ar_member_touch on VMS systems. - - * config.h-vms (pid_t, uid_t): Don't define. - - * remake.c: Delete declaration of vms_stat. - (name_mtime): Don't call vms_stat. - (f_mtime) [VMS]: Funky time value manipulation no longer necessary. - - * file.c (print_file): [VMS] Use ctime, not cvt_time. - - * make.h [VMS]: Don't define POSIX. - - * makefile.com (filelist): Include ar and arscan. - Also include them in the link commands. - Don't define NO_ARCHIVES in cc command. - - * makefile.vms (ARCHIVES, ARCHIVES_SRC): Uncomment. - (defines): Delete NO_ARCHIVES from list. - - * remake.c (f_mtime): Only check to see if intermediate file is - out of date if it also exists (i.e., mtime != (time_t) -1). - - * vmsdir.h (u_long, u_short): Skip typedefs if using DEC C. - -Fri Jun 20 23:02:07 1997 Rob Tulloh - - * w32/subproc/sub_proc.c: Get W32 sub_proc to handle shebang - (#!/bin/sh) in script files correctly. - Fixed a couple of memory leaks. - Fixed search order in find_file() (w32/subproc/sub_proc.c) so that - files with extensions are preferred over files without extensions. - Added search for files with .cmd extension too. - * w32/subproc/misc.c (arr2envblk): Fixed memory leak. - -Mon Aug 18 09:41:08 1997 Paul D. Smith - - * Version 3.75.91 - -Fri Aug 15 13:50:54 1997 Paul D. Smith - - * read.c (do_define): Remember to count the newline after the endef. - -Thu Aug 14 23:14:37 1997 Paul D. Smith - - * many: Rewrote builds to use Automake 1.2. - - * AUTHORS: New file. - * maintMakefile: Contains maintainer-only make snippets. - * GNUmakefile: This now only runs the initial auto* tools. - * COPYING,texinfo.tex,mkinstalldirs,install-sh: Removed (obtained - automatically by automake). - * compatMakefile: Removed (not needed anymore). - * README,build.sh.in: Removed (built from templates). - * config.h.in,Makefile.in: Removed (built by tools). - -Wed Aug 13 02:22:08 1997 Paul D. Smith - - * make.texinfo: Updates for DOS/Windows information (Eli Zaretskii) - * README,README.DOS: Ditto. - - * remake.c (update_file_1,f_mtime): Fix GPATH handling. - * vpath.c (gpath_search): Ditto. - - * file.c (rename_file): New function: rehash, but also rename to - the hashname. - * filedef.h: Declare it. - - * variable.c (merge_variable_set_lists): Remove free() of variable - set; since various files can share variable sets we don't want to - free them here. - -Tue Aug 12 10:51:54 1997 Paul D. Smith - - * configure.in: Require autoconf 2.12 - - * make.texinfo: Replace all "cd subdir; $(MAKE)" examples with a - more stylistically correct "cd subdir && $(MAKE)". - - * main.c: Global variable `clock_skew_detected' defined. - (main): Print final warning if it's set. - * make.h: Declare it. - * remake.c (f_mtime): Test and set it. - - * job.c (start_job_command): Add special optimizations for - "do-nothing" rules, containing just the shell no-op ":". This is - useful for timestamp files and can make a real difference if you - have a lot of them (requested by Fergus Henderson ). - - * configure.in,Makefile.in: Rewrote to use the new autoconf - program_transform_name macro. - - * function.c (function_strip): Strip newlines as well as spaces - and TABs. - -Fri Jun 6 23:41:04 1997 Rob Tulloh - - * remake.c (f_mtime): Datestamps on FAT-based files are rounded to - even seconds when stored, so if the date check fails on WINDOWS32 - systems, see if this "off-by-one" error is the problem. - - * General: If your TZ environment variable is not set correctly - then all your timestamps will be off by hours. So, set it! - -Mon Apr 7 02:06:22 1997 Paul D. Smith - - * Version 3.75.1 - - * compatMakefile (objs): Define & use the $(GLOB) variable so - that it's removed correctly from build.sh.in when it's built. - - * configure.in: On Solaris we can use the kstat_*() functions to - get load averages without needing special permissions. Add a - check for -lkstat to see if we have it. - - * getloadavg.c (getloadavg): Use HAVE_LIBKSTAT instead of SUN5 as - the test to enable kstat_open(), etc. processing. - -Fri Apr 4 20:21:18 1997 Eli Zaretskii - - * : Fixes to work in the DJGPP DOS environment. - -Mon Mar 31 02:42:52 1997 Paul D. Smith - - * function.c (expand_function): Added new function $(wordlist). - - * make.texinfo (Filename Functions): Document $(wordlist) function. - - * vpath.c (build_vpath_lists): Construct the GPATH variable - information in the same manner we used to construct VPATH. - (gpath_search): New function to search GPATH. - - * make.h: Declare the new function. - - * remake.c (update_file_1): Call it, and keep VPATH if it's found. - - * make.texinfo (Search Algorithm): Document GPATH variable. - -Sun Mar 30 20:57:16 1997 Paul D. Smith - - * main.c (handle_non_switch_argument): Defined the MAKECMDGOALS - variable to contain the user options passed in on the cmd line. - - * make.texinfo (Goals): Document MAKECMDGOALS variable. - - * remake.c (f_mtime): Print a warning if we detect a clock skew - error, rather than failing. - - * main.c (main): If we rebuild any makefiles and need to re-exec, - add "-o" options for each makefile rebuilt to avoid - infinite looping. - -Fri Mar 28 15:26:05 1997 Paul D. Smith - - * job.c (construct_command_argv_internal): Track whether the last - arg in the cmd string was empty or not (Roland). - (construct_command_argv_internal): If the shell line is empty, - don't do anything (Roland). - - * glob/glob.h,glob/glob.c,glob/fnmatch.c,glob/fnmatch.h: Install - the latest changes from the GLIBC version of glob (Ulrich Drepper). - - * getloadavg.c,make-stds.texi: New version (Roland). - - * (ALL): Changed WIN32 to W32 or WINDOWS32 (RMS). - -Mon Mar 24 15:33:34 1997 Rob Tulloh - - * README.W32: Describe preliminary FAT support. - - * build_w32.bat: Use a variable for the final exe name. - - * dir.c (find_directory): W32: Find the filesystem type. - (dir_contents_file_exists_p): W32: for FAT filesystems, always - rehash since FAT doesn't change directory mtime on change. - - * main.c (handle_runtime_exceptions): W32: Add an - UnhandledExceptionFilter so that when make bombs due to ^C or a - bug, it won't cause a GUI requestor to pop up unless debug is - turned on. - (main): Call it. - -Mon Mar 24 00:57:34 1997 Paul D. Smith - - * configure.in, config.h.in, config.ami, config.h-vms, config.h.w32: - Check for memmove() function. - - * make.h (bcopy): If memmove() available, define bcopy() to use it. - Otherwise just use bcopy(). Don't use memcpy(); it's not guaranteed - to handle overlapping moves. - - * read.c (read_makefile): Fix some uninitialized memory reads - (reported by Purify). - - * job.c (construct_command_argv_internal): Use bcopy() not - strcpy(); strcpy() isn't guaranteed to handle overlapping moves. - - * Makefile.in: Change install-info option ``--infodir'' to - ``--info-dir'' for use with new texinfo. - - * function.c (expand_function): $(basename) and $(suffix) should - only search for suffixes as far back as the last directory (e.g., - only the final filename in the path). - -Sun Mar 23 00:13:05 1997 Paul D. Smith - - * make.texinfo: Add @dircategory/@direntry information. - (Top): Remove previous reference to (dir) (from RMS). - (Static Usage): Add "all:" rule to example. - (Automatic Dependencies): fix .d file creation example. - - * Install VPATH+ patch: - - * filedef.h (struct file): Add in hname field to store the hashed - filename, and a flag to remember if we're using the vpath filename - or not. Renamed a few functions for more clarity. - - * file.c (lookup_file,enter_file,file_hash_enter): Store filenames - in the hash table based on their "hash name". We can change this - while keeping the original target in "name". - (rehash_file): Renamed from "rename_file" to be more accurate. - Changes the hash name, but not the target name. - - * remake.c (update_file_1): Modify -d output for more detailed - VPATH info. If we don't need to rebuild, use the VPATH name. - (f_mtime): Don't search for vpath if we're ignoring it. Call - renamed function rehash_file. Call name_mtime instead of - file_mtime, to avoid infinite recursion since the file wasn't - actually renamed. - - * implicit.c (pattern_search): if we find an implicit file in - VPATH, save the original name not the VPATH name. - - * make.texinfo (Directory Search): Add a section on the new VPATH - functionality. - -Sun Dec 1 18:36:04 1996 Andreas Schwab - - * dir.c (file_exists_p, file_impossible, file_impossible_p): If - dirname is empty replace it by the name of the root directory. - Note that this doesn't work (yet) for W32, Amiga, or VMS. - -Tue Oct 08 13:57:03 1996 Rob Tulloh - - * main.c (main): W32 bug fix for PATH vars. - -Tue Sep 17 1996 Paul Eggert - - * filedef.h (NEW_MTIME): Don't assume that time_t is a signed - 32-bit quantity. - - * make.h: (CHAR_BIT, INTEGER_TYPE_SIGNED, INTEGER_TYPE_MAXIMUM, - INTEGER_TYPE_MINIMUM): New macros. - -Tue Aug 27 01:06:34 1996 Roland McGrath - - * Version 3.75 released. - - * main.c (print_version): Print out bug-reporting address. - -Mon Aug 26 19:55:47 1996 Roland McGrath - - * main.c (print_data_base): Don't declare ctime; headers do it for us - already. - -Sun Jul 28 15:37:09 1996 Rob Tulloh (tulloh@tivoli.com) - - * w32/pathstuff.c: Turned convert_vpath_to_w32() into a - real function. This was done so that VPATH could contain - white space separated pathnames. Please note that directory - paths (in VPATH/vpath context) containing white space are not - supported (just as they are not under Unix). See README.W32 - for suggestions. - - * w32/include/pathstuff.h: Added prototype for the new - function convert_vpath_to_w32. Deleted macro for same. - - * README.W32: Added some notes about why I chose not to try - and support pathnames which contain white space and some - workaround suggestions. - -Thu Jul 25 19:53:31 1996 Roland McGrath - - * GNUmakefile (mkdep-nolib): Use -MM option unconditionally. - - * Version 3.74.7. - - * main.c (define_makeflags): Back up P to point at null terminator - when killing final space and dash before setting MFLAGS. - - From Robert Hoehne : - * dir.c [__MSDOS__ && DJGPP > 1]: Include and defin - `__opendir_flags' initialized to 0. - (dosify) [__MSDOS__ && DJGPP > 1]: Return name unchanged if _USE_LFN. - (find_directory) [__MSDOS__ && DJGPP > 1]: If _USE_LGN, set - __opendir_flags to __OPENDIR_PRESERVE_CASE. - - * vmsfunctions.c (vms_stat): `sys$dassgn (DevChan);' added by kkaempf. - - * GNUmakefile (w32files): Add NMakefile. - - * NMakefile (LDFLAGS_debug): Value fixed by tulloh. - -Sat Jul 20 12:32:10 1996 Klaus Kämpf (kkaempf@progis.de) - - * remake.c (f_mtime) [VMS]: Add missing `if' conditional for future - modtime check. - * config.h-vms, makefile.vms, readme.vms, vmsify.c: Update address. - -Sat Jul 20 05:29:43 1996 Roland McGrath - - * configure.in: Require autoconf 2.10 or later. - -Fri Jul 19 16:57:27 1996 Roland McGrath - - * Version 3.74.6. - - * GNUmakefile (w32files): New variable. - (distfiles): Add it. - * w32: Updated by Rob Tulloh. - - * makefile.vms (LOADLIBES): Fix typo. - -Sun Jul 14 12:59:27 1996 Roland McGrath - - * job.c (construct_command_argv_internal): Fix up #else, #endifs. - - * configh.dos: Define HAVE_DIRENT_H instead of DIRENT. - - * remake.c (f_mtime): Don't compare MTIME to NOW if MTIME == -1. - - * Version 3.74.5. - - * main.c (main): Exit with status 2 when update_goal_chain returns 2. - -Sat Jun 22 14:56:05 1996 Roland McGrath - - * configure.in: Don't check for _sys_siglist. - * make.h [HAVE__SYS_SIGLIST]: Don't test this; just punt if there is - no strsignal or sys_siglist. - - * read.c (conditional_line): Strip ws in `ifeq (a , b)' so it is the - same as `ifeq (a, b)'. - - * job.c (reap_children): Don't call die if handling_fatal_signal. - - * file.c (file_hash_enter): Allow renaming :: to : when latter is - non-target, or : to :: when former is non-target. - - * job.c (start_job_command): Call block_sigs. - (block_sigs): New function, broken out of start_job_command. - (reap_children): Block fatal signals around removing dead child from - chain and adjusting job_slots_used. - * job.h: Declare block_sigs. - - * remote-stub.c (remote_setup, remote_cleanup): New (empty) functions. - * main.c (main): Call remote_setup. - (die): Call remote_cleanup. - - * job.c (reap_children): Quiescent value of shell_function_pid is - zero, not -1. - - * main.c (print_version): Add 96 to copyright years. - -Sat Jun 15 20:30:01 1996 Andreas Schwab - - * read.c (find_char_unquote): Avoid calling strlen on every call - just to throw away the value most of the time. - -Sun Jun 2 12:24:01 1996 Roland McGrath - - * main.c (decode_env_switches): Prepend '-' to ARGV[1] if it contains - no '=', regardless of ARGC. - (define_makeflags): Elide leading '-' from MAKEFLAGS value if first - word is short option, regardless of WORDS. - -Wed May 22 17:24:51 1996 Roland McGrath - - * makefile.vms: Set LOADLIBES. - * makefile.com (link_using_library): Fix typo. - -Wed May 15 17:37:26 1996 Roland McGrath - - * dir.c (print_dir_data_base): Use %ld dev and ino and cast them to - long. - -Wed May 15 10:14:14 CDT 1996 Rob Tulloh - - * dir.c: W32 does not support inode. For now, fully qualified - pathname along with st_mtime will be keys for files. - Fixed problem where vpath can be confused when files - are added to a directory after the directory has already been - read in. The code now attempts to reread the directory if it - discovers that the datestamp on the directory has changed since - it was cached by make. This problem only seems to occur on W32 - right now so it is lumped under port #ifdef WINDOWS32. - - * function.c: W32: call subproc library (CreateProcess()) instead of - fork/exec. - - * job.c: W32: Added the code to do fork/exec/waitpid style processing - on W32 systems via calls to subproc library. - - * main.c: W32: Several things added here. First, there is code - for dealing with PATH and SHELL defaults. Make tries to figure - out if the user has %PATH% set in the environment and sets it to - %Path% if it is not set already. Make also looks to see if sh.exe - is anywhere to be found. Code path through job.c will change - based on existence of a working Bourne shell. The checking for - default shell is done twice: once before makefiles are read in - and again after. Fall back to MSDOS style execution mode if no sh.exe - is found. Also added some debug support that allows user to pause make - with -D switch and attach a debugger. This is especially useful for - debugging recursive calls to make where problems appear only in the - sub-make. - - * make.h: W32: A few macros and header files for W32 support. - - * misc.c: W32: Added a function end_of_token_w32() to assist - in parsing code in read.c. - - * read.c: W32: Fixes similar to MSDOS which allow colon to - appear in filenames. Use of colon in filenames would otherwise - confuse make. - - * remake.c: W32: Added include of io.h to eliminate compiler - warnings. Added some code to default LIBDIR if it is not set - on W32. - - * variable.c: W32: Added support for detecting Path/PATH - and converting them to semicolon separated lists for make's - internal use. New function sync_Path_environment() - which is called in job.c and function.c before creating a new - process. Caller must set Path in environment since we don't - have fork() to do this for us. - - * vpath.c: W32: Added detection for filenames containing - forward or backward slashes. - - * NMakefile: W32: Visual C compatible makefile for use with nmake. - Use this to build GNU make the first time on Windows NT or Windows 95. - - * README.W32: W32: Contains some helpful notes. - - * build_w32.bat: W32: If you don't like nmake, use this the first - time you build GNU make on Windows NT or Windows 95. - - * config.h.W32: W32 version of config.h - - * subproc.bat: W32: A bat file used to build the - subproc library from the top-level NMakefile. Needed because - WIndows 95 (nmake) doesn't allow you to cd in a make rule. - - * w32/include/dirent.h - * w32/compat/dirent.c: W32: opendir, readdir, closedir, etc. - - * w32/include/pathstuff.h: W32: used by files needed functions - defined in pathstuff.c (prototypes). - - * w32/include/sub_proc.h: W32: prototypes for subproc.lib functions. - - * w32/include/w32err.h: W32: prototypes for w32err.c. - - * w32/pathstuff.c: W32: File and Path/Path conversion functions. - - * w32/subproc/build.bat: W32: build script for subproc library - if you don't wish to use nmake. - - * w32/subproc/NMakefile: W32: Visual C compatible makefile for use - with nmake. Used to build subproc library. - - * w32/subproc/misc.c: W32: subproc library support code - * w32/subproc/proc.h: W32: subproc library support code - * w32/subproc/sub_proc.c: W32: subproc library source code - * w32/subproc/w32err.c: W32: subproc library support code - -Mon May 13 14:37:42 1996 Roland McGrath - - * Version 3.74.4. - - * GNUmakefile (vmsfiles): Fix typo. - - * GNUmakefile (amigafiles): Add amiga.h. - -Sun May 12 19:19:43 1996 Aaron Digulla - - * dir.c: New function: amigafy() to fold filenames - Changes HASH() to HASHI() to fold filenames on Amiga. - Stringcompares use strieq() instead of streq() - The current directory on Amiga is "" instead of "." - * file.c: Likewise. - - * amiga.c: New function wildcard_expansion(). Allows to use - Amiga wildcards with $(wildcard ) - - * amiga.h: New file. Prototypes for amiga.c - - * function.c: Use special function wildcard_expansion() for - $(wildcard ) to allow Amiga wildcards - The current directory on Amiga is "" instead of "." - - * job.c: No Pipes on Amiga, too - (load_too_high) Neither on Amiga - ENV variable on Amiga are in a special directory and are not - passed as third argument to main(). - - * job.h: No envp on Amiga - - * make.h: Added HASHI(). This is the same as HASH() but converts - it's second parameter to lowercase on Amiga to fold filenames. - - * main.c: (main), variable.c Changed handling of ENV-vars. Make - stores now the names of the variables only and reads their contents - when they are accessed to reflect that these variables are really - global (ie. they CAN change WHILE make runs !) This handling is - made in lookup_variable() - - * Makefile.ami: renamed file.h to filedep.h - Updated dependencies - - * read.c: "find_semicolon" is declared as static but never defined. - No difference between Makefile and makefile on Amiga; added - SMakefile to *default_makefiles[]. - (read_makefile) SAS/C want's two_colon and pattern_percent be set - before use. - The current directory on Amiga is "" instead of "." - Strange #endif moved. - - * README.Amiga: updated feature list - - * SMakefile: Updated dependencies - - * variable.c: Handling of ENV variable happens inside lookup_variable() - -Sat May 11 17:58:32 1996 Roland McGrath - - * variable.c (try_variable_definition): Count parens in lhs variable - refs to avoid seeing =/:=/+= inside a ref. - -Thu May 9 13:54:49 1996 Roland McGrath - - * commands.c (fatal_error_signal) [SIGQUIT]: Make SIGQUIT check - conditional. - - * main.c (main): Use unsigned for fread return. - - * read.c (parse_file_seq): Use `int' for char arg to avoid widening - conflict issues. - * dep.h: Fix prototype. - - * function.c (expand_function) [_AMIGA]: Fix some typos. - (patsubst_expand): Make len vars unsigned. - - * GNUmakefile (globfiles): Add AmigaDOS support files. - (distfiles): Add $(amigafiles). - (amigafiles): New variable. - -Thu Nov 7 10:18:16 1995 Aaron Digulla - - * Added Amiga support in commands.c, dir.c, function.c, - job.c, main.c, make.h, read.c, remake.c - * commands.c: Amiga has neither SIGHUP nor SIGQUIT - * dir.c: Amiga has filenames with Upper- and Lowercase, - but "FileName" is the same as "filename". Added strieq() - which is use to compare filenames. This is like streq() - on all other systems. Also there is no such thing as - "." under AmigaDOS. - * function.c: On Amiga, the environment is not passed as envp, - there are no pipes and Amiga can't fork. Use my own function - to create a new child. - * job.c: default_shell is "" (The system automatically chooses - a shell for me). Have to use the same workaround as MSDOS for - running batch commands. Added HAVE_SYS_PARAM_H. NOFILE isn't - known on Amiga. Cloned code to run children from MSDOS. Own - version of sh_chars[] and sh_cmds[]. No dup2() or dup() on Amiga. - * main.c: Force stack to 20000 bytes. Read environment from ENV: - device. On Amiga, exec_command() does return, so I exit() - afterwards. - * make.h: Added strieq() to compare filenames. - * read.c: Amiga needs special extension to have passwd. Only - one include-dir. "Makefile" and "makefile" are the same. - Added "SMakefile". Added special code to handle device names (xxx:) - and "./" in rules. - * remake.c: Only one lib-dir. Amiga link-libs are named "%s.lib" - instead of "lib%s.a". - * main.c, rule.c, variable.c: Avoid floats at all costs. - * vpath.c: Get rid of as many alloca()s as possible. - -Thu May 9 13:20:43 1996 Roland McGrath - - * read.c (read_makefile): Grok `sinclude' as alias for `-include'. - -Wed Mar 20 09:52:27 1996 Roland McGrath - - * GNUmakefile (vmsfiles): New variable. - (distfiles): Include $(vmsfiles). - -Tue Mar 19 20:21:34 1996 Roland McGrath - - Merged VMS port from Klaus Kaempf . - * make.h (PARAMS): New macro. - * config.h-vms: New file. - * makefile.com: New file. - * makefile.vms: New file. - * readme.vms: New file. - * vmsdir.h: New file. - * vmsfunctions.c: New file. - * vmsify.c: New file. - * file.h: Renamed to filedef.h to avoid conflict with VMS system hdr. - * ar.c: Added prototypes and changes for VMS. - * commands.c: Likewise. - * commands.h: Likewise. - * default.c: Likewise. - * dep.h: Likewise. - * dir.c: Likewise. - * expand.c: Likewise. - * file.c: Likewise. - * function.c: Likewise. - * implicit.c: Likewise. - * job.c: Likewise. - * job.h: Likewise. - * main.c: Likewise. - * make.h: Likewise. - * misc.c: Likewise. - * read.c: Likewise. - * remake.c: Likewise. - * remote-stub.c: Likewise. - * rule.c: Likewise. - * rule.h: Likewise. - * variable.c: Likewise. - * variable.h: Likewise. - * vpath.c: Likewise. - * compatMakefile (srcs): Rename file.h to filedef.h. - -Sat Aug 19 23:11:00 1995 Richard Stallman - - * remake.c (check_dep): For a secondary file, try implicit and - default rules if appropriate. - -Wed Aug 2 04:29:42 1995 Richard Stallman - - * remake.c (check_dep): If an intermediate file exists, - do consider its actual date. - -Sun Jul 30 00:49:53 1995 Richard Stallman - - * file.h (struct file): New field `secondary'. - * file.c (snap_deps): Check for .INTERMEDIATE and .SECONDARY. - (remove_intermediates): Don't delete .SECONDARY files. - -Sat Mar 2 16:26:52 1996 Roland McGrath - - * compatMakefile (srcs): Add getopt.h; prepend $(srcdir)/ to getopt*. - -Fri Mar 1 12:04:47 1996 Roland McGrath - - * Version 3.74.3. - - * remake.c (f_mtime): Move future modtime check before FILE is - clobbered by :: loop. - - * dir.c: Use canonical code from autoconf manual for dirent include. - [_D_NAMLEN]: Redefine NAMLEN using this. - (dir_contents_file_exists_p): Use NAMLEN macro. - (read_dirstream) [_DIRENT_HAVE_D_NAMLEN]: Only set d_namlen #if this. - - * compatMakefile (objs): Add missing backslash. - -Wed Feb 28 03:56:20 1996 Roland McGrath - - * default.c (default_terminal_rules): Remove + prefix from RCS cmds. - (default_variables): Put + prefix in $(CHECKOUT,v) value instead. - - * remake.c (f_mtime): Check for future timestamps; give error and mark - file as "failed to update". - -Fri Jan 12 18:09:36 1996 Roland McGrath - - * job.c: Don't declare unblock_sigs; job.h already does. - -Sat Jan 6 16:24:44 1996 Roland McGrath - - * acconfig.h (HAVE_SYSCONF_OPEN_MAX): #undef removed. - - * job.c (NGROUPS_MAX): Don't try to define this macro. - -Fri Dec 22 18:44:44 1995 Roland McGrath - - * compatMakefile (GETOPT, GETOPT_SRC, GLOB): Variables removed. - (objs, srcs): Include their values here instead of references. - -Thu Dec 14 06:21:29 1995 Roland McGrath - - * Version 3.74.2. - - * job.c (reap_children): Call unblock_sigs after start_job_command. - -Thu Dec 14 07:22:03 1995 Roland McGrath - - * dir.c (dir_setup_glob): Don't use lstat; glob never calls it anyway. - Avoid & before function names to silence bogus sunos4 compiler. - - * configure.in: Remove check for `sysconf (_SC_OPEN_MAX)'. - -Tue Dec 12 00:48:42 1995 Roland McGrath - - * Version 3.74.1. - - * dir.c (read_dirstream): Fix braino: fill in the buffer when not - reallocating it! - -Mon Dec 11 22:26:15 1995 Roland McGrath - - * misc.c (collapse_continuations): Fix skipping of trailing \s so - it can never dereference before the beginning of the array. - - * read.c (find_semicolon): Function removed. - (read_makefile): Don't use find_semicolon or remove_comments for - rule lines. Use find_char_unquote directly and handle quoted comments - properly. - - * default.c: Remove all [M_XENIX] code. - - * dir.c [HAVE_D_NAMLEN]: Define this for __GNU_LIBRARY__ > 1. - (D_NAMLEN): Macro removed. - (FAKE_DIR_ENTRY): New macro. - (dir_contents_file_exists_p): Test HAVE_D_NAMLEN instead of using - D_NAMLEN. - (read_dirstream): Return a struct dirent * for new glob interface. - (init_dir): Function removed. - (dir_setup_glob): New function. - * main.c (main): Don't call init_dir. - * read.c (multi_glob): Call dir_setup_glob on our glob_t and use - GLOB_ALTDIRFUNC flag. - - * misc.c (safe_stat): Function removed. - * read.c, commands.c, remake.c, vpath.c: Use plain stat instead of - safe_stat. - -Sat Nov 25 20:35:18 1995 Roland McGrath - - * job.c [HAVE_UNION_WAIT]: Include sys/wait.h. - - * main.c (log_working_directory): Made global. - Print entering msg only once. - * make.h (log_working_directory): Declare it. - * misc.c (message): Take new arg PREFIX. Print "make: " only if - nonzero. Call log_working_directory. - * remake.c: Pass new arg in `message' calls. - * job.c (start_job_command): Pass new arg to `message'; fix - inverted test in that call. - -Tue Nov 21 19:01:12 1995 Roland McGrath - - * job.c (start_job_command): Use `message' to print the command, - and call it with null if the command is silent. - * remake.c (touch_file): Use message instead of printf. - -Tue Oct 10 14:59:30 1995 Roland McGrath - - * main.c (enter_command_line_file): Barf if NAME is "". - -Sat Sep 9 06:33:20 1995 Roland McGrath - - * commands.c (delete_target): Ignore unlink failure if it is ENOENT. - -Thu Aug 17 15:08:57 1995 Roland McGrath - - * configure.in: Don't check for getdtablesize. - * job.c (getdtablesize): Remove decls and macros. - -Thu Aug 10 19:10:03 1995 Roland McGrath - - * main.c (define_makeflags): Omit command line variable - definitions from MFLAGS value. - - * arscan.c (ar_scan) [AIAMAG]: Check for zero MEMBER_OFFSET, - indicating a valid, but empty, archive. - -Mon Aug 7 15:40:03 1995 Roland McGrath - - * dir.c (file_impossible_p): Correctly reset FILENAME to name - within directory before hash search. - - * job.c (child_error): Do nothing if IGNORED under -s. - - * job.c (exec_command): Correctly use ARGV[0] for script name when - running shell directly. - -Tue Aug 1 14:39:14 1995 Roland McGrath - - * job.c (child_execute_job): Close STDIN_FD and STDOUT_FD after - dup'ing from them. Don't try to close all excess descriptors; - getdtablesize might return a huge value. Any open descriptors in - the parent should have FD_CLOEXEC set. - (start_job_command): Set FD_CLOEXEC flag on BAD_STDIN descriptor. - -Tue Jun 20 03:47:15 1995 Roland McGrath - - * read.c (read_all_makefiles): Properly append default makefiles - to the end of the `read_makefiles' chain. - -Fri May 19 16:36:32 1995 Roland McGrath - - * Version 3.74 released. - -Wed May 10 17:43:34 1995 Roland McGrath - - * Version 3.73.3. - -Tue May 9 17:15:23 1995 Roland McGrath - - * compatMakefile ($(infodir)/make.info): Make sure $$dir is set in - install-info cmd. - -Wed May 3 15:56:06 1995 Roland McGrath - - * file.c (print_file): Grok update_status of 1 for -q. - -Thu Apr 27 12:39:35 1995 Roland McGrath - - * Version 3.73.2. - -Wed Apr 26 17:15:57 1995 Roland McGrath - - * file.c (remove_intermediates): Fix inverted test to bail under - -n for signal case. Bail under -q or -t. - Skip files with update_status==-1. - - * job.c (job_next_command): Skip empty lines. - (new_job): Don't test the return of job_next_command. - Just let start_waiting_job handle the case of empty commands. - -Wed Apr 19 03:25:54 1995 Roland McGrath - - * function.c [__MSDOS__]: Include . From DJ Delorie. - - * Version 3.73.1. - -Sat Apr 8 14:53:24 1995 Roland McGrath - - * remake.c (notice_finished_file): Set FILE->update_status to zero - if it's -1. - -Wed Apr 5 00:20:24 1995 Roland McGrath - - * Version 3.73 released. - -Tue Mar 28 13:25:46 1995 Roland McGrath - - * main.c (main): Fixed braino in assert. - - * Version 3.72.13. - -Mon Mar 27 05:29:12 1995 Roland McGrath - - * main.c: Avoid string in assert expression. Some systems are broken. - -Fri Mar 24 00:32:32 1995 Roland McGrath - - * main.c (main): Handle 1 and 2 returns from update_goal_chain - makefile run properly. - - * Version 3.72.12. - - * main.c (handle_non_switch_argument): New function, broken out of - decode_switches. - (decode_switches): Set optind to 0 to reinitialize getopt, not to 1. - When getopt_long returns EOF, break the loop and handle remaining args - with a simple second loop. - - * remake.c (remake_file): Set update_status to 2 instead of 1 for - no rule to make. Mention parent (dependent) in error message. - (update_file_1): Handle FILE->update_status == 2 in -d printout. - * job.c (start_job_command, reap_children): Set update_status to 2 - instead of 1 for failed commands. - -Tue Mar 21 16:23:38 1995 Roland McGrath - - * job.c (search_path): Function removed (was already #if 0'd out). - * configure.in: Remove AC_TYPE_GETGROUPS; nothing needs it any more. - -Fri Mar 17 15:57:40 1995 Roland McGrath - - * configure.bat: Write @CPPFLAGS@ translation. - -Mon Mar 13 00:45:59 1995 Roland McGrath - - * read.c (parse_file_seq): Rearranged `l(a b)' -> `l(a) l(b)' loop - to not skip the elt immediately preceding `l(...'. - -Fri Mar 10 13:56:49 1995 Roland McGrath - - * Version 3.72.11. - - * read.c (find_char_unquote): Make second arg a string of stop - chars instead of a single stop char. Stop when any char in the - string is hit. All callers changed. - (find_semicolon): Pass stop chars "#;" to one find_char_unquote call, - instead of using two calls. If the match is not a ; but a #, - return zero. - * misc.c: Changed find_char_unquote callers here too. - - * Version 3.72.10. - - * read.c (read_makefile, parse_file_seq): Fix typo __MS_DOS__ -> - __MSDOS__. - - * GNUmakefile (globfiles): Add glob/configure.bat. - (distfiles): Add configh.dos, configure.bat. - -Wed Mar 8 13:10:57 1995 Roland McGrath - - Fixes for MS-DOS from DJ Delorie. - * read.c (read_makefile, parse_file_seq) [__MS_DOS__]: Don't see : - as separator in "C:\...". - * configh.dos (STDC_HEADERS): Define only if undefined. - (HAVE_SYS_PARAM_H): Don't define this. - (HAVE_STRERROR): Define this. - * job.c (construct_command_argv_internal) [__MSDOS__]: Fix typos. - - * Version 3.72.9. - - * main.c (decode_switches): Reset optind to 1 instead of 0. - -Tue Mar 7 17:31:06 1995 Roland McGrath - - * main.c (decode_switches): If non-option arg is "-", ignore it. - -Mon Mar 6 23:57:38 1995 Roland McGrath - - * Version 3.72.8. - -Wed Feb 22 21:26:36 1995 Roland McGrath - - * Version 3.72.7. - -Tue Feb 21 22:10:43 1995 Roland McGrath - - * main.c (main): Pass missing arg to tmpnam. - - * configure.in: Check for strsignal. - * job.c (child_error): Use strsignal. - * main.c (main): Don't call signame_init #ifdef HAVE_STRSIGNAL. - - * misc.c (strerror): Fix swapped args in sprintf. - -Mon Feb 13 11:50:08 1995 Roland McGrath - - * configure.in (CFLAGS, LDFLAGS): Don't set these variables. - -Fri Feb 10 18:44:12 1995 Roland McGrath - - * main.c (print_version): Add 95 to copyright years. - - * Version 3.72.6. - - * job.c (start_job_command): Remember to call notice_finished_file - under -n when not recursing. To do this, consolidate that code - under the empty command case and goto there for the -n case. - -Tue Feb 7 13:36:03 1995 Roland McGrath - - * make.h [! STDC_HEADERS]: Don't declare qsort. Sun headers - declare it int. - -Mon Feb 6 17:37:01 1995 Roland McGrath - - * read.c (read_makefile): For bogus line starting with tab, ignore - it if blank after removing comments. - - * main.c: Cast results of `alloca' to `char *'. - * expand.c: Likewise. - -Sun Feb 5 18:35:46 1995 Roland McGrath - - * Version 3.72.5. - - * configure.in: Check for mktemp. - * main.c (main) [! HAVE_MKTEMP]: Use tmpnam instead of mktemp. - - * configure.in (make_cv_sysconf_open_max): New check for `sysconf - (_SC_OPEN_MAX)'. - * acconfig.h: Added #undef HAVE_SYSCONF_OPEN_MAX. - * job.c [HAVE_SYSCONF_OPEN_MAX] (getdtablesize): Define as macro - using sysconf. - -Fri Jan 27 04:42:09 1995 Roland McGrath - - * remake.c (update_file_1): When !MUST_MAKE, don't set - FILE->update_status to zero before calling notice_finished_file. - (notice_finished_file): Touch only when FILE->update_status is zero. - (remake_file): Set FILE->update_status to zero after not calling - execute_file_command and deciding to touch instead. - -Thu Jan 26 01:29:32 1995 Roland McGrath - - * main.c (debug_signal_handler): New function; toggles debug_flag. - (main): Handle SIGUSR1 with that. - -Mon Jan 16 15:46:56 1995 Roland McGrath - - * compatMakefile (realclean): Remove Info files. - -Sun Jan 15 08:23:09 1995 Roland McGrath - - * Version 3.72.4. - - * job.c (start_job_command): Save and restore environ around vfork - call. - (search_path): Function #if 0'd out. - (exec_command): Use execvp instead of search_path. - - * expand.c (variable_expand): Rewrote computed variable name and - substitution reference handling to be simpler. First expand the - entire text between the parens if it contains any $s, then examine - the result of that for subtitution references and do no further - expansion while parsing them. - - * job.c (construct_command_argv_internal): Handle " quoting too, - when no backslash, $ or ` characters appear inside the quotes. - - * configure.in (union wait check): If WEXITSTATUS and WTERMSIG are - defined, just use int. - -Tue Jan 10 06:27:27 1995 Roland McGrath - - * default.c (default_variables) [__hpux]: Remove special - definition of ARFLAGS. Existence of the `f' flag is not - consistent across HPUX versions; and one might be using GNU ar - anyway. - - * compatMakefile (clean): Don't remove Info files. - - * compatMakefile (check): Remove gratuitous target declaration. - -Sat Jan 7 11:38:23 1995 Roland McGrath - - * compatMakefile (ETAGS, CTAGS): Don't use -t. - - * arscan.c (ar_name_equal) [cray]: Subtract 1 like [__hpux]. - - * main.c (decode_switches): For --help, print usage to stdout. - -Mon Dec 5 12:42:18 1994 Roland McGrath - - * Version 3.72.3. - - * remake.c (update_file_1): Do set_command_state (FILE, - cs_not_started) only if old state was deps_running. - -Mon Nov 28 14:24:03 1994 Roland McGrath - - * job.c (start_waiting_job): Use set_command_state. - - * build.template (CPPFLAGS): New variable. - (prefix, exec_prefix): Set from @...@. - (compilation loop): Pass $CPPFLAGS to compiler. - - * GNUmakefile (build.sh.in): Make it executable. - - * GNUmakefile (globfiles): Add configure.in, configure. - - * Version 3.72.2. - - * configure.in (AC_OUTPUT): Don't write glob/Makefile. - - * configure.in (AC_CHECK_SYMBOL): Use AC_DEFINE_UNQUOTED. - - * configure.in: Don't check for ranlib. - -Tue Nov 22 22:42:40 1994 Roland McGrath - - * remake.c (notice_finished_file): Only mark also_make's as - updated if really ran cmds. - -Tue Nov 15 06:32:46 1994 Roland McGrath - - * configure.in: Put dnls before random whitespace. - -Sun Nov 13 05:02:25 1994 Roland McGrath - - * compatMakefile (CPPFLAGS): New variable, set from @CPPFLAGS@. - (RANLIB): Variable removed. - (prefix, exec_prefix): Set these from @...@. - (.c.o): Use $(CPPFLAGS). - (glob/libglob.a): Don't pass down variables to sub-make. - glob/Makefile should be configured properly by configure. - (distclean): Remove config.log and config.cache (autoconf stuff). - -Mon Nov 7 13:58:06 1994 Roland McGrath - - * acconfig.h: Add #undef HAVE_UNION_WAIT. - * configure.in: Converted to Autoconf v2. - * dir.c: Test HAVE_DIRENT_H, HAVE_SYS_DIR_H, HAVE_NDIR_H instead - of DIRENT, SYSDIR, NDIR. - * build.sh.in (prefix, exec_prefix): Set these from @...@. - (CPPFLAGS): New variable, set from @CPPFLAGS@. - (compiling loop): Pass $CPPFLAGS before $CFLAGS. - * install.sh: File renamed to install-sh. - - * main.c (define_makeflags): When no flags, set WORDS to zero. - -Sun Nov 6 18:34:01 1994 Roland McGrath - - * Version 3.72.1. - - * main.c (define_makeflags): Terminate properly when FLAGSTRING is - empty. - -Fri Nov 4 16:02:51 1994 Roland McGrath - - * Version 3.72. - -Tue Nov 1 01:18:10 1994 Roland McGrath - - * Version 3.71.5. - - * job.c (start_job_command): When ARGV is nil, only set - update_state and call notice_finished_file if job_next_command - returns zero. - - * job.c (start_job_command): Call notice_finished_file for empty - command line. - -Thu Oct 27 02:02:45 1994 Roland McGrath - - * file.c (snap_deps): Set COMMANDS_SILENT for .SILENT, not - COMMANDS_NOERROR. - -Wed Oct 26 02:14:10 1994 Roland McGrath - - * Version 3.71.4. - -Tue Oct 25 22:49:24 1994 Roland McGrath - - * file.c (snap_deps): Set command_flags bits in all :: entries. - -Mon Oct 24 18:47:50 1994 Roland McGrath - - * make.h (posix_pedantic): Declare it. - * main.c (main): Move checks .IGNORE, .SILENT, .POSIX to - snap_deps. - * file.c (snap_deps): Check .IGNORE, .SILENT, .POSIX here instead - of in main. If .IGNORE has deps, OR COMMANDS_NOERROR into their - command_flags and don't set -i. Likewise .SILENT. - * job.c (start_job_command): In FLAGS initialization, OR in - CHILD->file->command_flags. - * file.h (struct file): New member `command_flags'. - -Sun Oct 16 01:01:51 1994 Roland McGrath - - * main.c (switches): Bump flag values for --no-print-directory and - --warn-undefined-variables, so neither is 1 (which indicates a - nonoption argument). - -Sat Oct 15 23:39:48 1994 Roland McGrath - - * main.c (main): Add missing code in .IGNORE test. - -Mon Oct 10 04:09:03 1994 Roland McGrath - - * variable.c (define_automatic_variables): Define +D and +F. - -Sat Oct 1 04:07:48 1994 Roland McGrath - - * main.c (main): Define hidden automatic variable with command - vars, and MAKEOVERRIDES to a reference to that. - (define_makeflags): If posix_pedantic, write a reference to that - instead. - -Thu Sep 29 00:14:26 1994 Roland McGrath - - * main.c (posix_pedantic): New variable. - (main): Set posix_pedantic if .POSIX is a target. - Fix .IGNORE and .SILENT checks to require is_target. - - * commands.c (set_file_variables): Define new automatic variable - $+, like $^ but before calling uniquize_deps. - - * job.c (reap_children): Call delete_child_targets for non-signal - error if .DELETE_ON_ERROR is a target. - -Tue Sep 27 01:57:14 1994 Roland McGrath - - * Version 3.71.3. - -Mon Sep 26 18:16:55 1994 Roland McGrath - - * job.c (reap_children): Don't change C->file->command_state when - dying. Test it only after calling start_job_command for a new - command line. When no more cmds, just set C->file->update_status. - (start_job_command): When the last line is empty or under -n, set - C->file->update_status. - (start_waiting_job): Grok cs_not_started after start_job_command - as success. - (new_job): Set C->file->update_status when there are no cmds. - (job_next_command): When out of lines, don't set - CHILD->file->update_status or CHILD->file->command_state. - - * main.c (quote_as_word): Renamed from shell_quote. Take new arg; - if nonzero, also double $s. - (main): Define MAKEOVERRIDES from command_variables here. - (define_makeflags): Don't use command_variables here; instead write a - reference $(MAKEOVERRIDES) in MAKEFLAGS. Make vars recursive. - - * dir.c [__MSDOS__]: Fixed typo. - - * vpath.c (selective_vpath_search): Reset EXISTS when stat fails. - -Sat Sep 10 03:01:35 1994 Roland McGrath - - * remake.c: Include and use assert instead of printfs - and abort. - - * main.c (decode_switches): Loop until optind hits ARGC, not just - until getopt_long returns EOF. Initialize C to zero before loop; - in loop if C is EOF, set optarg from ARGV[optind++], else call - getopt_long. - (decode_env_switches): Use variable_expand instead of - allocated_variable_expand. Allocate a fresh buffer to copy split - words into; scan characters by hand to break words and - debackslashify. - (shell_quote): New function. - (define_makeflags): Allocate doubled space for switch args, and command - variable names and values; use shell_quote to quote those things. - -Fri Sep 9 01:37:47 1994 Roland McGrath - - * Version 3.71.2. - - * acconfig.h: Add HAVE_SYS_SIGLIST and HAVE__SYS_SIGLIST. - - * main.c (decode_switches): The non-option return from getopt is - 1, not 0. - (command_variables): New type and variable. - (decode_switches, decode_env_switches): After making a variable - definition, record the struct variable pointer in the - command_variables chain. - (define_makeflags): If ALL, write variable definitions for - command_variables. - - * main.c (other_args): Variable removed. - (goals, lastgoal): New static variables (moved from auto in main). - (main): Don't process OTHER_ARGS at all. - Don't set variable MAKEOVERRIDES at all; define MAKE to just - $(MAKE_COMMAND). - (init_switches): Prepend a - {return in order} instead of a + - {require order}. - (decode_switches): Don't set OTHER_ARGS at all. - Grok '\0' return from getopt_long as non-option argument; try - variable definition and (if !ENV) enter goal targets here. - (decode_env_switches): Use allocated_variable_expand to store value. - Use find_next_token to simplify word-splitting loop. Don't - prepend a dash to uninterpreted value. Instead, if split into - only one word, try variable definition and failing that prepend a - dash to the word and pass it to decode_switches as a single arg. - -Wed Sep 7 03:02:46 1994 Roland McGrath - - * remake.c (notice_finished_file): Only recheck modtimes if - FILE->command_state was cs_running on entry (meaning the commands - actually just ran). - (update_file_1): Whenever we set FILE->update_status, call - notice_finished_file instead of just set_command_state. - * job.c (start_job_command): Whenever we set - CHILD->file->update_status, call notice_finished_file instead of - just set_command_state. - -Tue Sep 6 19:13:54 1994 Roland McGrath - - * default.c: Add missing ". - - * job.c: Changed all assignments of command_state members to calls - to set_command_state. - * remake.c: Likewise. - * file.c (set_command_state): New function. - * file.h: Declare set_command_state. - - * main.c (init_switches): Put a + first in options. - -Mon Jul 25 18:07:46 1994 Roland McGrath - - Merge MSDOS/GO32 port from DJ Delorie . - * vpath.c: Changed all uses of ':' to PATH_SEPARATOR_CHAR. - * main.c (directory_before_chdir): New variable, moved out of main - (was local). - (main) [__MSDOS__]: Look for \ or : to delimit last component of - PROGRAM. Don't frob ARGV[0] before setting MAKE_COMMAND variable. - (die): Change back to `directory_before_chdir' before dying. - * make.h (PATH_SEPARATOR_CHAR): New macro; differing defns for - [__MSDOS__] and not. - * job.c [__MSDOS__]: Include . - [__MSDOS__] (dos_pid, dos_status, dos_bname, dos_bename, - dos_batch_file): New variables. - (reap_children) [__MSDOS__]: Don't call wait; just examine those vars. - (unblock_sigs) [__MSDOS__]: Do nothing. - (start_job_command) [__MSDOS__]: Use spawnvpe instead of vfork & exec. - (load_too_high) [__MSDOS__]: Always return true. - (search_path) [__MSDOS__]: Check for : or / in FILE to punt. - Use PATH_SEPARATOR_CHAR instead of ':'. - (construct_command_argv_internal) [__MSDOS__]: Wholly different - values for sh_chars and sh_cmds. Wholly new code to handle shell - scripts. - * function.c (expand_function: `shell') [__MSDOS__]: Wholly new - implementation. - * dir.c [__MSDOS__] (dosify): New function. - (dir_contents_file_exists_p) [__MSDOS__]: Call it on FILENAME and - process the result instead of FILENAME itself. - (file_impossible_p) [__MSDOS__]: Likewise. - * default.c [__MSDOS__]: Define GCC_IS_NATIVE. - (default_suffix_rules) [__MSDOS__]: Use `y_tab.c' instead of `y.tab.c'. - (default_variables) [GCC_IS_NATIVE]: Set CC and CXX to `gcc', YACC to - `bison -y', and LEX to `flex'. - * configure.bat, configh.dos: New files. - * commands.c (fatal_error_signal) [__MSDOS__]: Just remove - intermediates and exit. - - * commands.c (set_file_variables): Add parens in length - computation in .SUFFIXES dep loop to quiet compiler warning. From - Jim Meyering. - - * read.c (read_makefile): Free FILENAME if we allocated it. From - Jim Meyering. - -Mon Jul 4 17:47:08 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * misc.c (safe_stat): New function, EINTR-safe wrapper around stat. - * vpath.c (selective_vpath_search): Use safe_stat in place of stat. - * read.c (construct_include_path): Use safe_stat in place of stat. - * job.c (search_path): Use safe_stat in place of stat. - * dir.c (find_directory): Use safe_stat in place of stat. - * commands.c (delete_target): Use safe_stat in place of stat. - * arscan.c (ar_member_touch) [EINTR]: Do EINTR looping around fstat. - * remake.c (name_mtime): Use safe_stat in place of stat. - (touch_file) [EINTR]: Do EINTR looping around fstat. - -Fri Jun 24 05:40:24 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Check for a shell command first, and - then strip leading tabs before further checking if it's not a - shell command line. - - * make.h [__arm]: Undefine POSIX. - [!__GNU_LIBRARY__ && !POSIX && !_POSIX_VERSION]: Don't declare system - functions that return int. - - * job.c (construct_command_argv_internal): After swallowing a - backslash-newline combination, if INSTRING is set goto string_char - (new label) for normal INSTRING handling code. - -Sat Jun 4 01:11:20 1994 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * configure.in: Don't check for sys_siglist and _sys_siglist with - AC_HAVE_FUNCS. Instead use two AC_COMPILE_CHECKs. - -Mon May 23 18:20:38 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.71.1 released. - - * make.h [!__GNU_LIBRARY__ && !POSIX]: Also test #ifndef - _POSIX_VERSION for these declarations. - - * misc.c [GETLOADAVG_PRIVILEGED] [POSIX]: Remove bogus #ifndefs - around #undefs of HAVE_SETREUID and HAVE_SETREGID. - -Sat May 21 16:26:38 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.71 released. - - * misc.c [GETLOADAVG_PRIVILEGED] [POSIX]: Don't test [HAVE_SETUID] - and [HAVE_SETGID]. Every system has those, and configure doesn't - check for them. - - * make.h [_POSIX_VERSION]: Don't #define POSIX #ifdef ultrix. - - * compatMakefile (loadavg): Depend on and use loadavg.c instead of - getloadavg.c. - (loadavg.c): Link or copy it from getloadavg.c. - (distclean): Remove loadavg.c. - -Mon May 16 22:59:04 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.70.4. - - * misc.c [GETLOADAVG_PRIVILEGED] [! POSIX]: Undefine HAVE_SETEUID - and HAVE_SETEGID. - - * default.c (default_terminal_rules): In SCCS rules, put - $(SCCS_OUTPUT_OPTION) before $<. On some systems -G is grokked - only before the file name. - * configure.in (SCCS_GET_MINUS_G check): Put -G flag before file name. - -Tue May 10 16:27:38 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Swallow - backslash-newline combinations inside '' strings too. - -Thu May 5 04:15:10 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (do_define): Call collapse_continuations on each line - before all else. - -Mon Apr 25 19:32:02 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Notice newline inside - '' string when RESTP is non-null. - -Fri Apr 22 17:33:30 1994 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.70.3. - - * remake.c (update_goal_chain): Reset FILE to G->file after the - double-colon loop so it is never null for following code. - - * read.c (read_makefile): Fix `override define' parsing to skip - whitespace after `define' properly. - - * compatMakefile (srcdir): Define as @srcdir@; don't reference - $(VPATH). - (glob/Makefile): New target. - -Thu Apr 21 16:16:55 1994 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.70.2. - - * misc.c (remove_comments): Use find_char_unquote. - * make.h (find_char_unquote): Declare it. - * read.c (find_char_unquote): New function, generalized from - find_percent. - (find_percent, find_semicolon, parse_file_seq): Use that. - -Wed Apr 20 18:42:39 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * implicit.c (pattern_search): Always allocate new storage for - FILE->stem. It is not safe to store STEM's address because it - might be auto storage. - - * configure.in: Check for seteuid and setegid. - * misc.c [HAVE_SETEUID]: Declare seteuid. - [HAVE_SETEGID]: Declare setegid. - (make_access, user_access) [HAVE_SETEUID]: Use seteuid. - [HAVE_SETEGID]: Use setegid. - - * remake.c (update_goal_chain): Set STATUS to FILE->update_status, - to preserve whether it's 2 for error or 1 for -q trigger. When - STATUS gets nonzero and -q is set, always stop immediately. - * main.c (main, decode_switches): Die with 2 for errors. - (main): Accept 2 return from update_goal_chain and die with that. - * misc.c (fatal, makefile_fatal): Die with 2; 1 is reserved for -q - answer. - * job.c (reap_children): Die with 2 for error. - (start_job_command): Set update_status to 2 for error. Set it to - 1 when we would run a command and question_flag is set. - - * read.c (read_makefile): Don't mark makefiles as precious. Just - like other targets, they can be left inconsistent and in need of - remaking by aborted commands. - - * read.c (read_makefile): Write no error msg for -include file. - -Tue Apr 5 05:22:19 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * commands.c (fatal_error_signal): Don't unblock signals. - - * file.h (struct file): Change member `double_colon' from flag to - `struct file *'. - * read.c (record_files): Set double_colon pointer instead of flag. - * main.c (main): When disqualifying makefiles for updating, use - double_colon pointer to find all entries for a file. - * file.c (enter_file): If there is already a double-colon entry - for the file, set NEW->double_colon to that pointer. - (file_hash_enter): Use FILE->double_colon to find all entries to - set name. - * remake.c (update_goal_chain): Do inner loop on double-colon entries. - (update_file): Use FILE->double_colon pointer to find all entries. - (f_mtime): Likewise. - (notice_finished_file): Propagate mtime change to all entries. - - * variable.c (try_variable_definition): Return after abort. - -Fri Apr 1 18:44:15 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Remove unused variable. - (parse_file_seq): When removing an elt that is just `)', properly - fix up the previous elt's next pointer. - -Mon Mar 28 18:31:49 1994 Roland McGrath (roland@mole.gnu.ai.mit.edu) - - * configure.in: Do AC_SET_MAKE. - * GNUmakefile (Makefile.in): Edit MAKE assignment into @SET_MAKE@. - -Fri Mar 4 00:02:32 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * function.c (subst_expand): If BY_WORD or SUFFIX_ONLY is set and - the search string is the empty string, find a match at the end of - each word (using end_of_token in place of sindex). - - * misc.c (end_of_token): Don't treat backslashes specially; you - can no longer escape blanks with backslashes in export, unexport, - and vpath. This was never documented anyway. - -Thu Mar 3 23:53:46 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Variable name for `define' is not just - first token; use whole rest of line and strip trailing blanks. - -Wed Feb 16 16:03:45 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.70.1. - - * read.c (read_makefile): Add -d msg stating args. - - * read.c (read_makefile): Use isspace to skip over leading - whitespace, and explicitly avoid skipping over tabs. Don't want - to skip just spaces though; formfeeds et al should be skipped. - - * default.c (default_variables) [__hpux]: Add f in ARFLAGS. - - * arscan.c (ar_name_equal) [__hpux]: Subtract 2 instead of 1 from - sizeof ar_name for max length to compare. - - * misc.c [GETLOADAVG_PRIVILEGED] [POSIX]: Undefine HAVE_SETREUID - #ifdef HAVE_SETUID; likewise HAVE_SETREGID and HAVE_SETGID. - - * main.c (main): Call user_access after setting `program', in case - it needs to use it in an error message. - - * read.c (read_makefile): Ignore an empty line starting with a tab. - -Thu Feb 10 21:45:31 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in (AC_SYS_SIGLIST_DECLARED): Use this instead of - AC_COMPILE_CHECK that is now its contents. - -Fri Feb 4 16:28:54 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h: #undef strerror after #include . - [! ANSI_STRING]: Declare strerror. - -Thu Feb 3 02:21:22 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * misc.c (strerror): #undef any macro before function definition. - -Mon Jan 31 19:07:23 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.c (try_variable_definition): Calculate BEG before loop - to strip blanks by decrementing END. Don't decr END to before BEG. - - * read.c (read_makefile): Skip over leading space characters, but - not tabs, after removing continuations and comments (it used to - use isspace). - -Tue Jan 25 16:45:05 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.c (define_automatic_variables): In $(@D) et al, use - patsubst to remove trailing slash. - - * commands.c (delete_target): New function, broken out of - delete_child_targets. Check for archive members and give special msg. - (delete_child_targets): Use delete_target. - -Mon Jan 17 17:03:22 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * default.c (default_suffix_rules): Use $(TEXI2DVI_FLAGS) in - texi2dvi rules. Use $(MAKEINFO_FLAGS) in makeinfo rules. - -Tue Jan 11 19:29:55 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * GNUmakefile (tarfiles): Omit make-doc. - (make-$(version).tar): Include make.info*. - -Fri Jan 7 16:27:00 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (configure, config.h.in): Comment out rules. - -Thu Jan 6 18:08:08 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (binprefix, manprefix): New variables. - (instname): Variable removed. - (install): Use $({bin,man}prefix)make in place of $(instname). - File targets likewised renamed. - -Mon Jan 3 17:50:25 1994 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.70 released. - -Thu Dec 23 14:46:54 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.69.3. - - * read.c (parse_file_seq): Inside multi-word archive ref - translation loop, check NEW1==0 at end and break out of the loop. - - * GNUmakefile (make-$(version).tar): Distribute install.sh. - * install.sh: New file. - - * configure.in (SCCS_GET_MINUS_G check): Put redirection for admin - cmds outside subshell parens, to avoid "command not found" msgs - from the shell. - -Wed Dec 22 17:00:43 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in (SCCS_GET_MINUS_G check): Put -G flag last in get cmd. - Redirect output & error from get to /dev/null. - Fix reversed sense of test. - -Fri Dec 17 15:31:36 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in (SCCS_GET_MINUS_G check): Use parens instead of - braces inside if condition command; some shells lose. - -Thu Dec 16 15:10:23 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.69.2. - - * arscan.c [M_UNIX]: Move #undef M_XENIX for PORTAR stuff. - (PORTAR) [M_XENIX]: Define to 0 instead of 1. - - * main.c (define_makeflags): Only export MAKEFLAGS if !ALL. - -Wed Dec 15 17:47:48 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (main): Cast result of pointer arith to unsigned int - before passing to define_variable for envars. Matters when - sizeof(unsigned)!=sizeof(ptrdiff_t). - -Tue Dec 14 14:21:16 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in: Add new check for SCCS_GET_MINUS_G. - * config.h.in: Add #undef SCCS_GET_MINUS_G. - * default.c (default_terminal_rules): Use `$(SCCS_OUTPUT_OPTION)' in - place of `-G $@' in SCCS commands. - (default_variables) [SCCS_GET_MINUS_G]: Define SCCS_OUTPUT_OPTION - to "-G$@". - - * configure.in (AC_OUTPUT): Put touch stamp-config in second arg - (so it goes in config.status), rather than afterward. - - * ar.c (ar_member_date): Don't call enter_file on the archive file - if it doesn't exist (by file_exists_p). - - * compatMakefile ($(infodir)/make.info): Replace `$$d/foo.info' - with `$$dir/make.info' in install-info invocation (oops). - - * vpath.c (construct_vpath_list): Only set LASTPATH set PATH when - we do not unlink and free PATH. - - * file.c (print_file_data_base): Fix inverted calculation for - average files per hash bucket. - - * read.c (readline): When we see a NUL, give only a warning and - synthesize a newline to terminate the building line (used to - fatal). Move fgets call into the loop condition, and after the - loop test ferror (used to test !feof in the loop). - -Fri Dec 3 16:40:31 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in: Check for strerror in AC_HAVE_FUNCS. - -Thu Dec 2 15:37:50 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - Differentiate different flavors of missing makefile error msgs, - removing gratuitous `fopen: ' and giving caller for included makefiles. - * misc.c [! HAVE_STRERROR]: Define our own strerror here. - (perror_with_name, pfatal_with_name): Use strerror instead of - replicating its functionality. - * read.c (read_makefile): Return int instead of void. - (read_all_makefiles, read_makefile): Change callers to notice zero - return and give error msg. - -Thu Nov 11 11:47:36 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.69.1. - - * default.c: Put `-G $@' before $< in SCCS cmds. - -Wed Nov 10 06:06:14 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): After trying a variable defn, notice if - the line begins with a tab, and diagnose an error. - -Sun Nov 7 08:07:37 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.69. - -Wed Nov 3 06:54:33 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.10. - - * implicit.c (try_implicit_rule): Look for a normal rule before an - archive rule. - -Fri Oct 29 16:45:28 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * function.c (expand_function: `sort'): Double NWORDS when it - overflows, instead of adding five. - - * compatMakefile (clean): Remove loadavg. - -Wed Oct 27 17:58:33 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.9. - - * file.h (NEW_MTIME): Define new macro. - * main.c (main): Set time of NEW_FILES to NEW_MTIME, not to - current time returned from system. Removed variable NOW. - * remake.c (notice_finished_file): Use NEW_MTIME in place of - current time here too. - -Tue Oct 26 19:45:35 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.8. - - * remake.c (update_file_1): Don't clear MUST_MAKE when FILE has no - cmds and !DEPS_CHANGED unless also !NOEXIST. - -Mon Oct 25 15:25:21 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (parse_file_seq): When converting multi-word archive - refs, ignore a word beginning with a '('. - -Fri Oct 22 02:53:38 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in: Check for sys/timeb.h. - * make.h [HAVE_SYS_TIMEB_H]: Test this before including it. - -Thu Oct 21 16:48:17 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.7. - - * rule.c (convert_suffix_rule): New local TARGPERCENT. Set it to - TARGNAME+1 for "(%.o)", to TARGNAME for "%.?". Use it in place of - TARGNAME to initialize PERCENTS[0]. - -Mon Oct 18 06:49:35 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in: Use AC_HAVE_HEADERS(unistd.h) instead of AC_UNISTD_H. - Remove AC_USG; it is no longer used. - - * file.c (print_file): New function, broken out of - print_file_data_base. - (print_file_data_base): Call it. - * rule.c (print_rule): New function, broken out of - print_rule_data_base. - (print_rule_data_base): Call it. - -Thu Oct 14 14:54:03 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * default.c (install_default_suffix_rules): New function, broken - out of install_default_implicit_rules. - (install_default_implicit_rules): Move suffix rule code there. - * make.h: Declare install_default_suffix_rules. - * main.c (main): Call install_default_suffix_rules before reading - makefiles. Move convert_to_pattern call before - install_default_implicit_rules. - - * job.h (struct child): Make `pid' member type `pid_t' instead of - `int'. - - * compatMakefile (RANLIB): New variable, set by configure. - (glob/libglob.a): Pass RANLIB value down to submake. - - Fixes for SCO 3.2 "devsys 4.2" from pss@tfn.com (Peter Salvitti). - * make.h: Include before for SCO lossage. - * job.c [! getdtablesize] [! HAVE_GETDTABLESIZE]: If NOFILE is not - defined but NOFILES_MAX is, define it to be that. - -Mon Oct 11 19:47:33 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * GNUmakefile (make-$(version).tar): Depend on acconfig.h, so it - is distributed. - -Sun Oct 3 15:15:33 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * default.c (default_terminal_rules): Add `-G $@' to SCCS get cmds. - -Tue Sep 28 14:18:20 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Add ^ to SH_CHARS; it - is another symbol for | in some shells. - * main.c (main): Add it to CMD_DEFS quoting list as well. - -Mon Sep 20 18:05:24 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Remove '=' from - SH_CHARS. Only punt on '=' if it is unquoted in a word before the - first word without an unquoted '='. - - * main.c (define_makeflags): Set v_export for MAKEFLAGS. - -Fri Sep 17 00:37:18 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * remake.c (update_file_1): Use .DEFAULT cmds for phony targets. - - * make.h [_AIX && _POSIX_SOURCE]: Define POSIX. - - * commands.c (delete_child_targets): Don't delete phony files. - - * job.c (start_job_command): Set COMMANDS_RECURSE in FLAGS if we - see a `+' at the beginning of the command line. - -Thu Sep 9 17:57:14 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.6. - -Wed Sep 8 20:14:21 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (define_makeflags): Define MAKEFLAGS with o_file, not o_env. - -Mon Aug 30 12:31:58 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * expand.c (variable_expand): Fatal on an unterminated reference. - -Thu Aug 19 16:27:53 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.5. - - * variable.c (define_automatic_variables): Define new o_default - variable `MAKE_VERSION' from version_string and remote_description. - - * make.h (version_string, remote_description): Declare these here. - * main.c: Don't declare version_string. - (print_version): Don't declare remote_description. - -Wed Aug 18 15:01:24 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Free space pointed to by CONDITIONALS - before restoring the old pointer. - -Mon Aug 16 17:33:36 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile ($(objs)): Depend on config.h. - - * GNUmakefile (build.sh.in): Depend on compatMakefile. - - * configure.in: Touch stamp-config after AC_OUTPUT. - -Fri Aug 13 16:04:22 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.4. - -Thu Aug 12 17:18:57 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h: Include instead of "config.h". - -Wed Aug 11 02:35:25 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (main): Make all variables interned from ENVP be v_export. - * variable.c (try_variable_definition): In v_default case, don't - check for an o_file variable that `getenv' finds. - - * job.c (reap_children): New local variable ANY_LOCAL; set it - while setting ANY_REMOTE. If !ANY_LOCAL, don't wait for local kids. - - * main.c (main): Don't call decode_env_switches on MFLAGS. DOC THIS. - - * function.c (expand_function): #if 0 out freeing of ENVP since it - is environ. - -Mon Aug 9 17:37:20 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.3. - - * remote-stub.c (remote_status): Set errno to ECHILD before return. - * job.c (reap_children): Scan the chain for remote children and - never call remote_status if there are none. - - * function.c (expand_function: `shell'): #if 0 out calling - target_environment; just set ENVP to environ instead. - - * job.c (reap_children): Check for negative return from - remote_status and fatal for it. - When blocking local child wait returns 0, then try a blocking call - to remote_status. - -Tue Aug 3 00:19:00 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (clean): Delete make.info* and make.dvi here. - (distclean): Not here. - - * dep.h (RM_*): Use #defines instead of enum to avoid lossage from - compilers that don't like enum values used as ints. - -Mon Aug 2 16:46:34 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (loadavg): Add $(LOADLIBES). - -Sun Aug 1 16:01:15 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.2. - - * compatMakefile (loadavg, check-loadavg): New targets. - (check): Depend on check-loadavg. - - * compatMakefile (glob/libglob.a): Depend on config.h. - - * misc.c (log_access): Write to stderr instead of stdout. - -Fri Jul 30 00:07:02 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68.1. - -Thu Jul 29 23:26:40 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in (SYS_SIGLIST_DECLARED): In test program include - #ifdef HAVE_UNISTD_H. - - * compatMakefile (.PHONY): Put after `all' et al. - - * configure.in: Add AC_IRIX_SUN. - -Wed Jul 28 17:41:12 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.68. - -Mon Jul 26 14:36:49 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.8. - -Sun Jul 25 22:09:08 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.7. - - * compatMakefile ($(infodir)/make.info): Don't use $(instname). - Run install-info script if present. - -Fri Jul 23 16:03:50 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h [STAT_MACROS_BROKEN]: Test this instead of [uts]. - - * configure.in: Add AC_STAT_MACROS_BROKEN. - -Wed Jul 14 18:48:11 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.6. - - * read.c (read_makefile): Recognize directive `-include', like - `include' but sets RM_DONTCARE flag. - - * variable.c (target_environment): If FILE is nil, use - current_variable_set_list in place of FILE->variables. - * function.c (expand_function: `shell'): Get an environment for - the child from target_environment instead of using environ. - - * dep.h: Declare read_all_makefiles here. - (RM_*): Define new enum constants. - * read.c (read_makefile): Second arg is FLAGS instead of TYPE. - Treat it as a bit mask containing RM_*. - (read_all_makefiles): For default makefiles, set D->changed to - RM_DONTCARE instead of 1. - * main.c: Don't declare read_all_makefiles here. - (main): Check `changed' member of read_makefiles elts for RM_* - flags instead of specific integer values. - -Mon Jul 12 22:42:17 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h [sequent && i386]: #undef POSIX. From trost@cse.ogi.edu. - -Thu Jul 8 19:51:23 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * vpath.c (construct_vpath_list): If ELEM is zero 0, free PATTERN - as well as VPATH. - (build_vpath_lists): Empty `vpaths' around construct_vpath_list - call for $(VPATH). Expand $(strip $(VPATH)), not just $(VPATH). - - * rule.c (convert_suffix_rule): Use alloca instead of xmalloc for - PERCENTS, whose storage is not consumed by create_pattern_rule. - - * make.h [__mips && _SYSTYPE_SVR3]: #undef POSIX. - -Wed Jun 30 18:11:40 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.5. - - * rule.c (max_pattern_targets): New variable. - (count_implicit_rule_limits): Compute its value. - * rule.h: Declare it. - * implicit.c (pattern_search): Make TRYRULES max_target_patterns - times bigger. Move adding new TRYRULES elt inside the inner - targets loop, so each matching target gets its own elt in MATCHES - and CHECKED_LASTSLASH. - - * file.c (remove_intermediates): If SIG!=0 say `intermediate file' - instead of just `file' in error msg. - -Fri Jun 25 14:55:15 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv): Turn off - --warn-undefined-variables around expansion of SHELL and IFS. - * read.c (tilde_expand): Likewise for HOME. - (read_all_makefiles): Likewise for MAKEFILES. - * vpath.c (build_vpath_lists): Likewise for VPATH. - - * main.c (warn_undefined_variables_flag): New flag variable. - (switches): Add --warn-undefined-variables. - * make.h (warn_undefined_variables_flag): Declare it. - * expand.c (warn_undefined): New function. - (reference_variable): Call it if the variable is undefined. - (variable_expand): In substitution ref, call warn_undefined if the - variable is undefined. - - * default.c (default_pattern_rules): Add `%.c: %.w %.ch' and - `%.tex: %.w %.ch' rules. - (default_suffix_rules: .w.c, .w.tex): Pass three args: $< - $@. - (default_suffixes): Add `.ch'. - -Mon Jun 21 17:55:39 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * default.c (default_suffixes): Replace `.cweb' with `.w'. - (default_suffix_rules): Rename `.cweb.c' and `.cweb.tex' to `.w.c' - and `.w.tex'. - -Fri Jun 11 14:42:09 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile ($(bindir)/$(instname)): Add missing backslash. - -Thu Jun 10 18:14:08 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.4. - - * read.c (multi_glob): Don't free OLD and OLD->name in the - FOUND!=0 fork. Use new block-local variable F instead of - clobbering OLD. - - * ar.c (glob_pattern_p): New function, snarfed from glob/glob.c. - (ar_glob): Call it; return nil immediately if MEMBER_PATTERN - contains no metacharacters. - -Wed Jun 9 16:25:35 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * ar.c (ar_glob{_match,_alphacompare}): New function. - - * dep.h [! NO_ARCHIVES]: Declare it. - * read.c (multi_glob) [! NO_ARCHIVES]: Use it on archive member elts. - - * read.c (read_makefile): Pass flag (1) to parse_file_seq, not to - multi_glob (which doesn't take a 3rd arg). - * rule.c (install_pattern_rule): Likewise. - * default.c (set_default_suffixes): Here too. - * function.c (string_glob): Don't pass gratuitous arg to multi_glob. - - * read.c (parse_file_seq) [! NO_ARCHIVES]: Add post-processing - loop to translate archive refs "lib(a b)" into "lib(a) lib(b)". - -Mon Jun 7 19:26:51 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (installdirs): Actually pass directory names. - ($(bindir)/$(instname)): Test chgrp&&chmod exit status with `if'; - if it fails, echo a warning msg, but don't make the rule fail. - - * read.c (tilde_expand): New function, broken out of tilde_expand. - (multi_glob): Call it. - (construct_include_path): Expand ~ in directory names. - * dep.h: Declare tilde_expand. - * main.c (enter_command_line_file): Expand ~ at the start of NAME. - (main): Expand ~ in -C args. - * read.c (read_makefile): Expand ~ in FILENAME unless TYPE==2. - -Fri Jun 4 13:34:47 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (decode_env_switches): Use xmalloc instead of alloca for ARGS. - - * main.c (main): Put result of alloca in temporary variable with - simple assignment, to make SGI compiler happy. - -Thu Jun 3 20:15:46 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.3. - - * main.c (main): Before re-execing, remove intermediate files, and - print the data base under -p. Sexier debugging message. - - * implicit.c (pattern_search): Allocate an extra copy of the name - of a winning intermediate file when putting it in FOUND_FILES. - -Wed Jun 2 16:38:08 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Pass flag (1) to parse_file_seq, not to - multi_glob (which doesn't take a 3rd arg). - - * dir.c (dir_contents_file_exists_p): When reading dirents, ignore - chars within D_NAMLEN that are NULs. - - * main.c (decode_switches): Don't savestring ARGV[0] to put it - into `other_args'. - For string switch, don't savestring `optarg'. - (main): Don't free elts of makefiles->list that are "-". - Use alloca'd rather than savestring'd storage for elts of - makefiles->list that are temporary file names. - * read.c (read_all_makefiles): Don't free *MAKEFILES. - * file.c (enter_file): Don't strip `./'s. - * main.c (enter_command_line_file): New function. - (main): Use it in place of enter_file for command-line goals from - other_files, and for old_files and new_files. - -Mon May 31 18:41:40 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.2. - - * compatMakefile (.SUFFIXES): Add .info. - ($(infodir)/$(instname).info): Find make.info* in cwd if there, - else in $srcdir. Use basename to remove dir name from installed name. - -Thu May 27 17:35:02 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * implicit.c (pattern_search): When interning FOUND_FILES, try - lookup_file first; if found, free the storage for our copy of the name. - -Wed May 26 14:31:20 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67.1. - - * main.c (decode_switches): In usage msg, write `--switch=ARG' or - `--switch[=OPTARG]' rather than `--switch ARG' or `--switch [ARG]'. - -Mon May 24 16:17:31 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * rule.c (convert_suffix_rule): New function. - (convert_to_pattern): Use it instead of doing all the work here - several times. - For target suffix `.a', generate both the archive magic rule and - the normal rule. - - * compatMakefile (distclean): Remove stamp-config. - -Sat May 22 16:15:18 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.67. - - * file.c (remove_intermediates): Don't write extra space after `rm'. - - * main.c (struct command_switch.type): Remove `usage_and_exit'. - (print_usage_flag): New variable. - (switches: --help): Make type `flag', to set print_usage_flag. - (init_switches): Remove `usage_and_exit' case. - (decode_switches): Likewise. - (decode_switches): Print usage if print_usage_flag is set. - When printing usage, die with status of BAD. - (main): Die with 0 if print_version_flag. - -Fri May 21 16:09:28 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.66. - -Wed May 19 21:30:44 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (installdirs): New target. - (install): Depend on it. - -Sun May 16 20:15:07 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.65.2. - -Fri May 14 16:40:09 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * vpath.c (construct_vpath_list): In removal loop for DIRPATH==0, - set LASTPATH to PATH, not NEXT. - - * dir.c (read_dirstream): Break out of loop after incrementing - DS->buckets such that it reaches DIRFILE_BUCKETS; avoid trying to - dereference DS->contents->files[DIRFILE_BUCKETS]. - - * read.c (read_makefile): Clear no_targets after reading a - targetful rule line. - - * main.c (main): If print_version_flag is set, exit after printing - the version. - (switches): Change --version docstring to say it exits. - - * make.h [butterfly]: #undef POSIX. - -Wed May 12 15:20:21 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.65.1. - - * arscan.c (ar_scan) [! AIAMAG]: Don't declare LONG_NAME. - [AIAMAG]: Pass TRUNCATE flag arg to (*FUNCTION), always zero. - - * function.c (handle_function): Use fatal instead of - makefile_fatal when reading_filename is nil. - - * configure.in: Add AC_GETGROUPS_T. - * job.c (search_path): Use GETGROUPS_T in place of gid_t. - -Sun May 9 15:41:25 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.65. - -Fri May 7 18:34:56 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * function.c (handle_function): Fatal for unmatched paren. - -Thu May 6 16:13:41 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.64.3. - - * commands.c (handling_fatal_signal): New variable. - (fatal_error_signal): Set it. - * job.c (reap_children): Avoid nonreentrant operations if that is set. - * make.h: Declare handling_fatal_signal. - - * expand.c (reference_variable): New function, snippet of code - broken out of simple-reference case of variable_expand. - (variable_expand): Use it for simple refs. - (variable_expand): When checking for a computed variable name, - notice a colon that comes before the final CLOSEPAREN. Expand - only up to the colon, and then replace the pending text with a - copy containing the expanded name and fall through to subst ref - handling. - (variable_expand): Don't bother expanding the name if a colon - appears before the first $. - (expand_argument): Use alloca instead of savestring. - (variable_expand): For subst ref, expand both sides of = before - passing to [pat]subst_expand. Use find_percent instead of lindex - to check the lhs for a %. - -Wed May 5 14:45:52 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.64.2. - -Mon May 3 17:00:32 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * arscan.c (ar_name_equal) [AIAMAG]: Abort if TRUNCATED is nonzero. - - * read.c (read_makefile): Pass extra arg of 1 to parse_file_seq, - not to multi_glob. - -Thu Apr 29 19:47:33 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.64.1. - - * arscan.c (ar_scan): New local flag var LONG_NAME. Set it when - we read the member name in any of the fashions that allow it to be - arbitrarily long. Pass its negation to FUNCTION. - (describe_member): Take TRUNCATED from ar_scan and print it. - (ar_name_equal): Take new arg TRUNCATED; if nonzero, compare only - the first sizeof (struct ar_hdr.ar_name) chars. - (ar_member_pos): Take TRUNCATED from ar_scan, pass to ar_name_equal. - * ar.c (ar_member_date_1): Likewise. - -Wed Apr 28 21:18:22 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (reap_children): Before calling start_job_command to start - the next command line, reset C->remote by calling start_remote_job_p. - -Mon Apr 26 15:56:15 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * arscan.c (ar_scan): New local var NAMEMAP. - In loop, rename NAME to NAMEBUF; new var NAME is a pointer; new - flag IS_NAMEMAP. When extracting the member name, always put a - null at its end first. If the name is "//" or "/ARFILENAMES", set - IS_NAMEMAP. If we have already read in NAMEMAP, and NAME looks - like " /N", get full name from NAMEMAP+N. - Else if NAME looks like "#1/N", read N chars from the - elt data to be the full name. At end of loop, if IS_NAMEMAP, read - the elt's data into alloca'd NAMEMAP. - (ar_name_equal): #if 0 truncating code. - - * make.h: Don't declare vfork at all. It returns int anyway, - unless declared it; and we conflicted with some systems. - - * main.c (define_makeflags): If FLAGSTRING[1] is '-', define - MAKEFLAGS to all of FLAGSTRING, not &FLAGSTRING[1]. Don't want to - define it to something like "-no-print-directory". - Use %g format instead of %f for floating-valued things. - -Thu Apr 22 18:40:58 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * GNUmakefile (Makefile.in): Use a substitution ref on nolib-deps - to change remote-%.dep to remote-stub.dep. - -Wed Apr 21 15:17:54 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.64. - -Fri Apr 16 14:22:22 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (install): Remove - prefix from chgrp+chmod. - - * Version 3.63.8. - -Thu Apr 15 18:24:07 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * acconfig.h: New file; contains "#undef SCCS_GET" for autoheader. - * configure.in: If /usr/sccs/get exists, define SCCS_GET to that, - else to "get". - * default.c (default_variables): Set GET to macro SCCS_GET. - - * read.c (parse_file_seq): Take extra arg STRIP; strip `./' only - if nonzero. I hope this is the last time this argument is added - or removed. - (read_makefile): Pass it 1 when parsing include file names. - Pass it 1 when parsing target file names. - Pass it 1 when parsing static pattern target pattern names. - * rule.c (install_pattern_rule): Pass it 1 when parsing rule deps. - * default.c (set_default_suffixes): Pass it 1 when parsing - default_suffixes. - * function.c (string_glob): Pass it 0 here. - -Wed Apr 14 11:32:05 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * misc.c (log_access): New function. - ({init,user,make,child}_access): Call it. - (child_access): Abort if !access_inited. - - * main.c (switches: --no-print-directory): Use 1 instead of -1 for - single-letter option. - (init_switches, decode_switches, define_makeflags): An option with - no single-letter version is no longer indicated by a value of -1; - instead a value that is !isalnum. - (init_switches): Don't put such switches into the string, only - into the long_option table. - - * make.h [!NSIG] [!_NSIG]: #define NSIG 32. - - * job.c [HAVE_WAITPID]: Remove #undef HAVE_UNION_WAIT. AIX's - bsdcc defined WIF* to use union wait. - - * main.c (struct command_switch): Change member `c' to type int. - (switches): Make const. - (decode_switches): Use `const struct command_switch *'. - (define_makeflags): Likewise. - - * default.c (default_suffix_rules): Add `-o $@' to makeinfo rules. - -Mon Apr 12 12:30:04 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.63.7. - - * configure.in (AC_HAVE_HEADERS): Check for string.h and memory.h. - Removed AC_MEMORY_H. - * make.h [USG, NeXT]: Don't test these. - [HAVE_STRING_H]: Test this to include string.h and define ANSI_STRING. - [HAVE_MEMORY_H]: Test this instead of NEED_MEMORY_H. - [! ANSI_STRING]: Put decls of bcopy et al here. - [sparc]: Don't test this for alloca.h; HAVE_ALLOCA_H is sufficient. - [HAVE_SIGSETMASK]: Test this rather than USG. - [__GNU_LIBRARY__ || POSIX]: Don't #include again. - * main.c (main): Handle SIGCHLD if defined, and SIGCLD if defined. - It doesn't hurt to do both if they are both defined, and testing - USG is useless. - * dir.c: Rationalize directory header conditionals. - * arscan.c [HAVE_FCNTL_H]: Test this rather than USG || POSIX. - - * default.c (default_suffixes): Add `.txinfo'. - (default_suffix_rules): Add `.txinfo.info' and `.txinfo.dvi' rules. - - * variable.c (try_variable_definition): Replace RECURSIVE flag - with enum FLAVOR, which can be simple, recursive, or append. - Recognize += as append flavor. Set new variable VALUE in a switch - on FLAVOR. For append flavor, prepend the variable's old value. - If the variable was previously defined recursive, set FLAVOR to - recursive; if it was defined simple, expand the new value before - appending it to the old value. Pass RECURSIVE flag to - define_variable iff FLAVOR == recursive. - - * variable.c (try_variable_definition): Use alloca and bcopy for - NAME, instead of savestring. Might as well use stack storage - since we free it immediately anyway. - -Thu Apr 8 18:04:43 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (start_waiting_jobs): Move decl of JOB outside of loop. - - * main.c (define_makeflags): Rename `struct flag' member `switch' - to `cs', which is not a reserved word. - -Wed Apr 7 15:30:51 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (new_job): Call start_waiting_jobs first thing. - (start_waiting_job): Changed return type from void to int. - Return 0 when putting the child on the waiting_jobs chain. - (start_waiting_jobs): Don't check load and job_slots here. - Always take a job off the chain and call start_waiting_job on it; - give up and return when start_waiting_job returns zero. - - * main.c (define_makeflags: struct flag): Change member `char c' to - `struct command_switch *switch'. - (ADD_FLAG): Set that to CS instead of CS->c. - If CS->c is -1, increment FLAGSLEN for the long name. - When writing out FLAGS, handle FLAGS->switch->c == -1 and write - the long name instead. - - * compatMakefile (stamp-config): New target of old config.h rule. - Touch stamp-config after running config.status. - (config.h): Just depend on stamp-config, and have empty commands. - -Mon Apr 5 20:14:02 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c [HAVE_WAITPID]: #undef HAVE_UNION_WAIT. - - * configure.in (AC_HAVE_FUNCS): Check for psignal. - -Fri Apr 2 17:15:46 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (long_option_aliases): Remove "new"; it is already an - unambiguous prefix of "new-file". - -Sun Mar 28 16:57:17 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.63.6. - -Wed Mar 24 14:26:19 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * vpath.c (selective_vpath_search): When adding the - name-within-directory at the end of NAME, and we don't add a - slash, don't copy FILENAME in one char too far into NAME. - - * variable.c (define_automatic_variables): Find default_shell's - length with strlen, not numerology. - -Wed Mar 17 20:02:27 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (define_makeflags): Add the elts of a string option in - reverse order, so they come out right when reversed again. - -Fri Mar 12 15:38:45 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (make.info): Use `-o make.info'. - -Thu Mar 11 14:13:00 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (REMOTE): Set to @REMOTE@; change comments to - reflect new use. - (objs): Replace remote.o with remote-$(REMOTE).o. - (srcs): Replace remote.c with remote-$(REMOTE).c. - (remote.o): Rule removed. - - * configure.in (REMOTE): Subst this in Makefile et al; default "stub". - Use AC_WITH to grok --with-customs arg to set REMOTE=cstms. - * GNUmakefile (build.sh.in): Filter out remote-% from objs list. - * build.template (REMOTE): New var; set to @REMOTE@. - (objs): Add remote-${REMOTE}.o. - -Wed Mar 10 15:12:24 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.63.5. - - * implicit.c (pattern_search): Fix "dependent"->"dependency" in - "Rejecting impossible" -d msg. - - * file.c (file_hash_enter): New local vars {OLD,NEW}BUCKET. Store - mod'd values there; never mod {OLD,NEW}HASH. - -Mon Mar 8 13:32:48 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * remake.c [eta10]: Include instead of . - - * compatMakefile (VPATH): Set this to @srcdir@. - (srcdir): Set this to $(VPATH). - - * main.c (main): New local var DIRECTORY_BEFORE_CHDIR. Save in it - a copy of CURRENT_DIRECTORY after the first getcwd. Use it - instead of CURRENT_DIRECTORY when chdir'ing back before re-execing. - - * remake.c (notice_finished_file): Pass missing SEARCH arg to f_mtime. - - * read.c (read_makefile): Remove extraneous arg to parse_file_seq. - -Mon Feb 22 14:19:38 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile ($(infodir)/$(instname).info): Use , instead of / - as the sed delimiter char. - -Sun Feb 21 14:11:04 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.63.4. - - * rule.h (struct rule): Removed `subdir' member. - * rule.c (new_pattern_rule): No need to clear it. - (count_implicit_rule_limits): Set the `changed' flag in each dep - that refers to a nonexistent directory. No longer set rule-global - `subdir' flag with that information. - (print_rule_data_base): Don't record info on `subdir' flags. - - * implicit.c (pattern_search): Check the DEP->changed flag rather - than the (now gone) RULE->subdir flag. Also test CHECK_LASTSLASH; - if it is set, the file might exist even though the DEP->changed - flag is set. - - * rule.c (count_implicit_rule_limits): Pass "", not ".", as file - name arg to dir_file_exists_p to check for existence of directory. - - * implicit.c (pattern_search): Inside dep-finding loop, set - CHECK_LASTSLASH from the value recorded in CHECKED_LASTSLASH[I], - rather than computing it anew. - - * commands.c (set_file_variables): Must alloca space for PERCENT - and copy it, to avoid leaving the trailing `)' in the value. - - * misc.c (remove_comments): Fixed backslash-checking loop - condition to allow it to look at the first char on the line. - P2 >= LINE, not P2 > LINE. - - * compatMakefile ($(bindir)/$(instname)): Before moving $@.new to - $@, rm $@.old and mv $@ to $@.old. - - * variable.c (try_variable_definition): Take new args FILENAME and - LINENO. Fatal if the variable name is empty. - * read.c (read_makefile): Change callers. - * main.c (main): Likewise. - - * compatMakefile (group): Define to @KMEM_GROUP@, autoconf magic - that configure will replace with the group owning /dev/kmem. - -Mon Feb 8 14:26:43 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * vpath.c (vpath_search): Take second arg MTIME_PTR, pass thru to - selective_vpath_search. - (selective_vpath_search): Take second arg MTIME_PTR. - If the dir cache thinks a file exists, stat it to make sure, and - put the modtime in *MTIME_PTR. - * remake.c (library_search): Take second arg MTIME_PTR. - When we find a match, record its mtime there. - Pass MTIME_PTR through to vpath_search to do same. - (f_mtime): Pass &MTIME as new 2nd arg to {vpath,library}_search; - store it in FILE->last_mtime if set nonzero. - * implicit.c (pattern_search): Pass nil 2nd arg to vpath_search. - - * compatMakefile (remote.o): Prepend `$(srcdir)/' to `remote-*.c', - so globbing looks somewhere it will find things. - - * compatMakefile ($(infodir)/$(instname).info): Install `make.info*' - not `$(srcdir)/make.info*'; no need to use basename. - -Fri Feb 5 12:52:43 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.63.3. - - * compatMakefile (install): Add missing ;\s. - - Make -, @, and + prefixes on a pre-expanded command line affect - all lines in the expansion, not just the first. - * commands.h (struct commands): Replace `lines_recurse' member - with `lines_flags'. - (COMMANDS_{RECURSE,SILENT,NOERROR}): New macros, bits to set in - that flag byte. - * commands.c (chop_commands): Set `lines_flags' instead of - `lines_recurse'. Record not only + but also @ and - prefixes. - * remake.c (notice_finished_file): Check the COMMANDS_RECURSE bit - in FILE->cmds->lines_flags, rather than FILE->cmds->lines_recurse. - * job.c (start_job_command): Replaced RECURSIVE and NOPRINT local - var with FLAGS; initialize it to the appropriate `lines_flags' byte. - Set CHILD->noerror if the COMMANDS_NOERROR bit is set in FLAGS. - Set the COMMANDS_SILENT bit in FLAGS for a @ prefix. - - * remake.c (update_goal_chain): Set G->file to its prev after - checking for G being finished, since that check needs to examine - G->file. - - * configure.in (union wait check) [HAVE_WAITPID]: Try using - waitpid with a `union wait' STATUS arg. If waitpid and union wait - don't work together, we should not use union wait. - - * Version 3.63.2. - - * remake.c (update_goal_chain): When G->file->updated, move - G->file to its prev. We aren't finished until G->file is nil. - -Thu Feb 4 12:53:04 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (starting_directory): New global variable. - (main): Set it to cwd after doing -Cs. - (log_working_directory): Use it, rather than computing each time. - * make.h: Declare it. - - * compatMakefile (SHELL): Define to /bin/sh for losing Unix makes. - - * main.c (decode_env_switches): Allocate (1 + LEN + 1) words for - ARGV, rather than LEN words plus one byte. - -Wed Feb 3 18:13:52 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile ($(bindir)/$(instname)): Put - before - install_setgid command line, so its failure won't be an error. - (infodir): New variable. - (install): Depend on $(infodir)/$(instname).info. - ($(infodir)/$(instname).info): New target. - - * read.c (read_makefile): If FILENAMES is nil when we see a line - starting with a tab, don't treat it as a command. Just fall - through, rather than giving an error. - - * read.c (read_makefile): If the NO_TARGETS flag is set when we see a - command line, don't clear it before continuing. We want - subsequent command lines to be ignored as well. - - * job.c (new_job): Before expanding each command line, collapse - backslash-newline combinations that are inside var or fn references. - -Mon Feb 1 16:00:13 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (exec_prefix): Default to $(prefix), not /usr/local. - - * compatMakefile (make.info): Pass -I$(srcdir) to makeinfo. - - * job.c [POSIX] (unblock_sigs): Made global. - [!POSIX] (unblock_sigs): Move defns to job.h. - * job.h [POSIX] (unblock_sigs): Declare. - -Sun Jan 31 19:11:05 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * read.c (read_makefile): In vpath parsing, after finding the - pattern token, take entire rest of line as the search path, not - just the next token. - - * compatMakefile (remote.o): Depend on remote-*.c. - -Thu Jan 28 16:40:29 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * commands.c (set_file_variables): Don't define any F or D versions. - * variable.c (define_automatic_variables): Define them here as - recursively-expanded variables that use the dir and notdir funcs. - - * variable.c (target_environment): In v_default case, don't export - o_default or o_automatic variables. - - * configure.in (union wait check): Remove ` and ' inside C code; - they confuse the shell script. - -Mon Jan 25 13:10:42 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.63.1. - - * vpath.c (construct_vpath_list): When skipping further processing - of an elt that is ".", don't also skip the code that pushes P past - the next separator. - - * compatMakefile (distclean): Don't remove make-*. - - * configure.in (HAVE_UNION_WAIT): Try to use WEXITSTATUS if it's - defined. If one cannot use WEXITSTATUS with a `union wait' - argument, we don't want to believe the system has `union wait' at all. - - * remake.c (update_file): Do nothing to print "up to date" msgs. - (update_goal_chain): Do it here instead. - Use the `changed' flag of each goal's `struct dep' to keep track - of whether files_remade (now commands_started) changed around a - call to update_file for that goal. - When a goal is finished, and its file's update_status is zero (i.e., - success or nothing done), test the `changed' flag and give an "up - to date" msg iff it is clear. - * make.h (files_remade): Renamed to commands_started. - * remake.c: Changed defn. - (update_goal_chain): Changed uses. - * job.c (start_job_command): Increment commands_started here. - (reap_children): Not here. - - * remake.c (update_goal_chain): Don't do anything with files' - `prev' members. update_file now completely handles this. - - * variable.c (target_environment): Don't expand recursive - variables if they came from the environment. - - * main.c (define_makeflags): For flags with omitted optional args, - store {"", 0} with ADD_FLAG. When constructing FLAGSTRING, a flag - so stored cannot have more flags appended to the same word. - -Fri Jan 22 14:46:16 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.c (print_variable_set): In vars/bucket calculation, - don't spuriously multiply by 100. - - * Version 3.63. - - * job.c [!HAVE_UNION_WAIT] (WTERMSIG, WCOREDUMP, WEXITSTATUS): - Don't define if already defined. - - * remake.c (update_file): Don't keep track of the command_state before - calling update_file_1. Remove local variable COMMANDS_FINISHED, - and don't test it to decide to print the "is up to date" msg. - Testing for files_remade having changed should always be sufficient. - The old method lost when we are called in the goal chain run on a - makefile, because the makefile's command_state is already - `cs_finished' from the makefile chain run. - - * misc.c [HAVE_SETRE[GU]ID]: Test these to decl setre[gu]id. - - * configure.in: Rewrote wait checking. - Use AC_HAVE_HEADERS to check for . - Use AC_HAVE_FUNCS to check for waitpid and wait3. - Use a compile check to test just for `union wait'. - * job.c: Rewrote conditionals accordingly. - [HAVE_WAITPID]: Test this only to define WAIT_NOHANG. - [HAVE_WAIT3]: Likewise. - [HAVE_UNION_WAIT]: Test this to define WAIT_T and W*. - - * configure.in: Set CFLAGS and LDFLAGS before all checks. - - * dir.c: Add static forward decls of {open,read}_dirstream. - -Thu Jan 21 17:18:00 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.31. - - * job.c [NGROUPS_MAX && NGROUPS_MAX==0]: #undef NGROUPS_MAX. - - * compatMakefile (CFLAGS, LDFLAGS): Set to @CFLAGS@/@LDFLAGS@. - * build.template (CFLAGS, LDFLAGS): Same here. - * configure.in: AC_SUBST(CFLAGS) and LDFLAGS. - Set them to -g if not defined in the environment. - - * remake.c (library_search): Use LIBNAME consistently, setting it - only once, to be the passed name sans `-l'. - Pass new var FILE to be modified by vpath_search. - -Mon Jan 18 14:53:54 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.30. - - * job.c (start_waiting_jobs): Return when job_slots_used is equal to - job_slots. - - * configure.in: Add AC_CONST for the sake of getopt. - - * read.c (read_makefile): Continue after parsing `override' - directive, rather than falling through to lossage. - Check for EOL or blank after "override define". - - * compatMakefile (.c.o, remote.o): Put $(CFLAGS) after other switches. - -Fri Jan 15 12:52:52 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.29. - - * main.c (define_makeflags): After writing everything into - FLAGSTRING, only back up two chars if [-1] is a dash, meaning we - just wrote " -". Always terminate the string at *P. - - * remake.c (library_search): When constructing names in std dirs, - use &(*LIB)[2] for the stem, not LIBNAME (which points at the - buffer we are writing into!). - -Thu Jan 14 13:50:06 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Set IN_IGNORED_DEFINE for "override - define" when IGNORING is true. - - * compatMakefile (distclean): Remove config.status and build.sh. - -Wed Jan 13 16:01:12 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.28. - - * misc.c (xmalloc, xrealloc): Cast result of malloc/realloc to - (char *). - - * arscan.c (ar_scan) [AIAMAG]: Cast read arg to (char *). - - * variable.c (define_automatic_variables): Override SHELL value for - origin o_env_override as well as o_env. - - * GNUmakefile (build.sh.in): Don't replace %globobjs%. Instead, - add the names of the glob objects (w/subdir) to %objs%. - * build.template (globobjs): Removed. - Take basename of $objs before linking. - -Tue Jan 12 12:31:06 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.27. - - * configure.in (AC_OUTPUT): Also edit build.sh. - * build.template: New file. - * GNUmakefile (build.sh.in): New rule to create it from build.template. - (make-$(version).tar.Z): Depend on build.sh.in. - - * main.c (die): Call print_data_base if -p. - (main): Don't call it here. - - * compatMakefile (defines): Add @DEFS@. configure should turn this - into -DHAVE_CONFIG_H. - -Mon Jan 11 14:39:23 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.26. - - * misc.c (init_access): Surround with #ifdef GETLOADAVG_PRIVILEGED. - ({make,user,child}_access) [! GETLOADAVG_PRIVILEGED]: Make no-op. - * compatMakefile (install_setgid): New var, set by configure. - (install): Install setgid $(group) only if $(install_setgid) is true. - -Fri Jan 8 15:31:55 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (load_too_high): If getloadavg fails with errno==0, give a - message saying that load limits are not supported. - - * vpath.c (construct_vpath_list): Rewrote path deletion code to - not try to use PATH's next link after freeing PATH. - - * main.c (define_makeflags): Rewritten; now handles string-valued - option, and has no arbitrary limits. - (switches): Set `toenv' flag for -I and -v. - - * main.c (decode_env_switches): Cast return value of alloca to char *. - - * misc.c (child_access) [HAVE_SETREUID, HAVE_SETREGID]: Use - setre[gu]id in place of set[gu]id. - -Wed Jan 6 15:06:12 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (main): Define MAKEOVERRIDES, MAKE, and MAKE_COMMAND with - origin o_default. - - * make.h [POSIX]: Don't test this to use ANSI_STRING. - Testing STDC_HEADERS should be sufficient. - - * job.h: Declare start_waiting_jobs. - - * read.c (read_makefile): Add missing parens in if stmt that find - conditional directives. - - * main.c (main): Declare init_dir. - * implicit.c (pattern_search): Always use two % specs in a - DEBUGP2, and always pass two non-nil args. - Cast field width args to int. - Add missing parens in !RULE->subdir if stmt. - * function.c (expand_function, patsubst_expand): Add parens around - assignments inside `while' stmts. - * commands.c (print_commands): Cast field width args to int. - - * read.c (do_define): Cast return value of alloca to (char *). - - * main.c (init_switches): New function, broken out of decode_switches. - (decode_switches): Take new arg ENV. If set, ignore non-option - args; print no error msgs; ignore options with clear `env' flags. - (decode_env_switches): Rewritten to chop envar value into words - and pass them to decode_switches. - (switches): Set `env' flag for -I and -v. - - * dir.c (init_dir): Cast free to __glob_closedir_hook's type. - -Tue Jan 5 14:52:15 1993 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.25. - - * job.c [HAVE_SYS_WAIT || !USG]: Don't #include and - . interacts badly with , and - we don't need these anyway. - - * configure.in (AC_HAVE_FUNCS): Check for setre[gu]id. - * misc.c ({user,make}_access): Test #ifndef HAVE_SETRE[GU]ID, not - #ifdef POSIX || USG. SunOS 4.1 is supposedly POSIX.1 compliant, - but its set[gu]id functions aren't; its setre[gu]id functions work. - - * misc.c ({user,make,child}_access): Give name of caller in error msgs. - - * job.c (load_too_high): Say "cannot enforce load limit" in error msg. - - * configure.in: Call AC_PROG_CC. - * compatMakefile (CC): Define to @CC@ (autoconf magic). - - * compatMakefile: Add .NOEXPORT magic target. - -Mon Jan 4 17:00:03 1993 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (print_version): Updated copyright to include 93. - -Thu Dec 31 12:26:15 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * make.h [_AIX]: Don't declare alloca. - -Tue Dec 29 13:45:13 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.24. - - * compatMakefile (objs): Add signame.o. - (srcs): Add signame.[ch]. - - * compatMakefile (srcs): Add config.h.in. - (remote.o): Add -I. before -I$(srcdir). - -Mon Dec 28 15:51:26 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.23. - - * read.c (readline): Fatal when LEN==0, indicating a line starting - with a NUL. - (readline): Take new arg LINENO, for use in error msg. - (read_makefile, do_define): Pass it. - - * compatMakefile (glob/libglob.a): Pass -DHAVE_CONFIG_H in CPPFLAGS. - (.c.o): Add -I. before -I$(srcdir). - -Wed Dec 23 12:12:04 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Accept and ignore a rule with no targets. - - * compatMakefile (ALLOCA_SRC): New variable. - (srcs): Include its value. - - * read.c (struct conditional): Renamed member `max_ignoring' to - `allocated'; added new member `seen_else'. - (conditional_line): Initialize seen_else flag when starting an `if...'; - set it when we see an `else'; fatal if set when we see `else'. - (read_makefile): Fatal "missing `endif'" if there are any pending - conditionals, not just if we are still ignoring. - -Tue Dec 22 15:36:28 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (manext): Set to 1, not l. - ($(mandir)/$(instname).$(manext)): Use $(srcdir) for make.man in cmds. - - * file.c (file_hash_enter): Don't call uniquize_deps here. - * read.c (record_files): Likewise. - * implicit.c (pattern_search): Likewise. - * commands.c (set_file_variables): Call it only here. - - * default.c (default_variables) [__convex__]: FC=fc. - - * variable.c (target_environment): Expand the values of recursively - expanded variables when putting them into the environment. - * expand.c (recursively_expand): Made global. - * make.h (recursively_expand): Declare it. - - * remake.c (check_dep): Set FILE->command_state to cs_deps_running - when a dep's command_state is cs_running or cs_deps_running. - - * read.c (read_makefile): Changed error msg for spurious cmds to - not say "first target". - -Sun Dec 20 17:56:09 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * configure.in: Do AC_CONFIG_HEADER right after AC_INIT. - * make.h (HAVE_CONFIG_H): #include "config.h", then #define this. - * compatMakefile (config.h, configure, config.h.in): New rules. - (defines): Removed @DEFS@. - -Thu Dec 17 16:11:40 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (realclean): Just depend on distclean; no cmds. - (distclean): Do what realclean did before; also remove Makefile and - config.h; don't remove configure. - (info, dvi): New targets; depend on make.{info,dvi}. - (doc): Removed target. - (MAKEINFO, TEXI2DVI): New vars. - (make.info, make.dvi): Use them instead of explicit cmds. - -Wed Dec 16 16:25:24 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * configure.in: Added fcntl.h to AC_HAVE_HEADERS. getloadavg cares. - -Wed Dec 9 15:21:01 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (long_option_aliases): Add --new-file alias for -W. - - * default.c (default_variables): Change all C++ to CXX and C++FLAGS - to CXXFLAGS. - - * read.c (do_define): Expand the variable name before using it. - - * main.c (main): Define variable "MAKE_COMMAND" to argv[0]; - define "MAKE=$(MAKE_COMMAND) $(MAKEOVERRIDES)" always. - - * remake.c (library_search): Search for libNAME.a in cwd; look in - vpath before looking in standard dirs, not after. - Changed order of std dirs to: /lib, /usr/lib, ${prefix}/lib. - -Mon Nov 23 14:57:34 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * default.c (default_pattern_rules, default_terminal_rules): Added - brackets around initializers. - - * variable.c (try_variable_definition): Don't check for LINE[0]=='\t'. - (try_variable_definition): Expand the name before defining the var. - - * job.c (init_siglist): Removed function. - Removed decl of `sys_siglist'. - * make.h [! HAVE_SYS_SIGLIST]: #include "signame.h". - [HAVE_SYS_SIGLIST && !SYS_SIGLIST_DECLARED]: Declare sys_siglist - only under these conditions. - * main.c (main): Don't declare init_siglist. - (main) [! HAVE_SYS_SIGLIST]: Call signame_init instead of init_siglist. - -Wed Nov 18 14:52:51 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (record_files): Don't try to append to FIRSTDEPS if it's - nil; instead just set it to MOREDEPS. - -Mon Nov 16 17:49:17 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * vpath.c (construct_vpath_list): Initialize P to DIRPATH before - loop that sets MAXELEM. - -Fri Nov 13 18:23:18 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.22. - -Thu Nov 12 15:45:31 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (start_job_command): Under -n, increment files_remade after - processing (i.e., printing) all command lines. - -Tue Nov 10 15:33:53 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * read.c (record_files): Append new deps if this rule has no - commands; prepend them to existing deps if this rule has no commands. - - * dir.c (open_dirstream): Return nil if DIR->contents->files is nil. - - * read.c (parse_file_seq): Removed last arg STRIP. Always strip `./'s. - (read_makefile): Changed callers. - * function.c (string_glob): Likewise. - * rule.c (install_pattern_rule): Likewise. - -Mon Nov 9 17:50:16 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * remake.c (files_remade): Made global. - (notice_finished_file): Don't increment files_remade here; this - function gets called in many situations where no remaking was in - fact done. - * job.c (reap_children): Do it here instead, when we know that - actual commands have been run for the file. - * make.h (files_remade): Declare it. - -Thu Nov 5 18:26:10 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * vpath.c (construct_vpath_list): Allow blanks as well as colons to - separate elts in the search path. - - * read.c (read_makefile): Don't fatal on extra tokens in `vpath'. - The search path can contain spaces now. - -Tue Nov 3 20:44:32 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (check): New target; no-op. - - * file.c (file_hash_enter): Mod OLDHASH by FILE_BUCKETS after - testing for OLDHASH==0 but before using the value. - (rename_file): Don't mod OLDHASH by FILE_BUCKETS before passing it - to file_hash_enter. - - * file.c (rename_file): Notice when OLDFILE->cmds came from - default.c, and don't try to print ->filename in that case. - -Sun Oct 25 01:48:23 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * remake.c (update_file): Don't process F->also_make here. - (notice_finished_file): Don't process FILE->also_make if no attempt - to update FILE was actually made. - Fixed to call f_mtime directly to refresh their modtimes. - -Sat Oct 24 22:08:59 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (find_percent): Don't increment P again after skipping - an escaped %. - - * expand.c (variable_expand): In call to patsubst_expand, don't - find `%'s ourselves; let that function do it. - - * read.c (read_makefile: record_waiting_files): Don't call - record_files if FILENAMES is nil. - (read_makefile): All alternatives in the parsing, except for rule - lines, fall through to the end of the loop. At the end of the - loop, do record_waiting_files so we notice later spurious cmds. - -Fri Oct 23 15:57:37 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.c (define_automatic_variables): Free old value of SHELL - before replacing it. - -Thu Oct 15 18:57:56 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (.c.o): Add -I$(srcdir)/glob to flags. - - * dir.c (open_dirstream): Cast return value to __ptr_t. - - * default.c (default_variables: "GET") [_IBMR2]: Use USG defn. - - * make.h (MAXPATHLEN): Moved out of #ifndef POSIX. - (GET_PATH_MAX): Moved from #ifdef POSIX to #ifdef PATH_MAX #else. - Define as (get_path_max ()). - [! PATH_MAX] (NEED_GET_PATH_MAX): Define. - [! PATH_MAX] (get_path_max): Declare fn. - * misc.c [NEED_GET_PATH_MAX] (get_path_max): New function. - -Mon Oct 12 13:34:45 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.21. - - * job.c (sys_siglist): Only declare #ifndef SYS_SIGLIST_DECLARED. - * make.h [! HAVE_SYS_SIGLIST && HAVE__SYS_SIGLIST]: #define - SYS_SIGLIST_DECLARED. - - * dir.c (file_impossible): When initializing DIR->contents, set - DIR->contents->dirstream to nil. - - * compatMakefile (GLOB): Define new variable. - (objs): Use it, rather than glob/libglob.a explicitly. - - * read.c (parse_file_seq): When stripping "./", handle cases like - ".///foo" and "./////". - * file.c (lookup_file, enter_file): Likewise. - -Sun Oct 11 17:00:35 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * dir.c (struct dirstream, {open,read}_dirstream): New - data type and functions to read a directory sequentially. - (init_dir): New function to hook it into glob. - * main.c (main): Call init_dir. - - * compatMakefile (objs): Added glob/libglob.a. - * configure.in: Remove code to test for glob. - -Fri Oct 9 12:08:30 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (record_files): Generalized test for NAME pointing - somewhere into F->name. - - * variable.c (define_variable_in_set): Free old value when replacing. - - * read.c (do_define): Free the linebuffer before returning. - (record_files): When clearing .SUFFIXES deps, free their data. - (multi_glob): Free OLD and its data when replacing it with results - of glob run. - - * commands.c (set_file_variables): Use alloca in place of xmalloc - for temp space for $^, $?, et al. - - * dir.c (struct directory): New member `contents' replaces `files' - and `dirstream'. - (struct directory_contents): New type. - (directories_contents): New hash table. - (dir_struct_file_exists_p): Take a struct directory_contents. - (dir_file_exists_p): Pass it the `contents' member of the dir found. - (dir_struct_file_exists_p): Renamed to dir_contents_file_exists_p; - made static. Return 0 if DIR is nil (meaning it couldn't be stat'd). - (dir_file_exists_p, find_directory): Change all callers. - (file_impossible): Use DIR->contents, initializing it if nil. - (print_dir_data_base): Use DIR->contents, and print out device and - inode numbers with each directory. - - * Changes for performance win from John Gilmore : - * dir.c (DIRECTORY_BUCKETS): Increase to 199. - (DIRFILE_BUCKETS): Decrease to 107. - (find_directory): Allocate and zero a multiple of - sizeof (struct dirfile *), not of sizeof (struct dirfile). - (dir_struct_file_exists_p): New function, nearly all code from - dir_file_exists_p. - (dir_file_exists_p): Just call find_directory+dir_struct_file_exists_p. - * vpath.c (selective_vpath_search): Remove redundant - dir_file_exists_p call. - - * configure.in: Comment out glob check; always use our code. - -Fri Oct 2 19:41:20 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * make.h [! HAVE_SYS_SIGLIST && HAVE__SYS_SIGLIST]: #define - HAVE_SYS_SIGLIST; after doing #define sys_siglist _sys_siglist, we - do have it. - -Wed Sep 30 19:21:01 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (main): Don't do -w automatically if -s. - -Tue Sep 29 21:07:55 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (printed_version): Move variable inside print_version. - (print_version): Return immediately if printed_version is set. - (die): Don't test printed_version here. - (decode_switches): Under -v, do print_version before giving usage. - (DESCRIPTION_COLUMN): New macro. - (decode_switches): Use it when printing the usage message. - Leave at least two spaces between options and their descriptions. - -Fri Sep 25 13:12:42 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.20. - -Wed Sep 16 16:15:22 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * read.c (read_makefile): Save errno value from trying to open - FILENAME, and restore it before erring; otherwise we get the errno - value from the last elt of the search path. - -Tue Sep 15 15:12:47 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (long_option_aliases): Add --stop for -S. - - * read.c (word1eq): Do strncmp before dereferencing someplace that - may be out in space. - -Wed Sep 9 15:50:41 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * remake.c (notice_finished_file): If all the command lines were - recursive, don't do the touching. - - * job.c (start_job_command): Don't check for + here. - * commands.c (chop_commands): Do it here instead. - - * default.c (default_terminal_rules): Prepend + to cmds for RCS. - -Wed Sep 2 17:53:08 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (objs): Include $(ALLOCA). - - * make.h [CRAY]: Move #define signal bsdsignal to before #includes. - -Thu Aug 27 17:45:43 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * read.c (default_include_directories): Add INCLUDEDIR first. - * compatMakefile (includedir): Define. - (defines): Add -D for INCLUDEDIR="$(includedir)". - - * read.c (read_makefile): Grok multiple files in `include'; - globbing too. - - * remake.c (library_search): New function. - (library_file_mtime): Remove function. - (f_mtime): Use library_search instead of library_file_mtime. - * compatMakefile (libdir): Define. - (defines): Add -D for LIBDIR="$(libdir)". - * make.texinfo (Libraries/Search): Document change. - - * file.c (rename_file): Fix file_hash_enter call with missing arg. - -Wed Aug 26 17:10:46 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.19. - - * main.c (main): Set command_state to cs_finished for temp files - made for stdin makefiles. - - * main.c (decode_switches): Don't tell getopt to return non-option - args in order. - Ignore an argument of `-'. - -Thu Aug 20 13:36:04 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * job.c (start_job_command): If (touch_flag && !RECURSIVE), ignore - the command line and go to the next. - (notice_finished_file): Under -t, touch FILE. - * remake.c (remake_file): Don't touch it here. - -Wed Aug 19 16:06:09 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * function.c (pattern_matches): Use temporary for strlen (WORD) - instead of two function calls. - - * compatMakefile (LOAD_AVG): Remove variable and comments. - -Tue Aug 18 14:58:58 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * make.texinfo (Running): Node renamed to `make Invocation'. - -Fri Aug 14 12:27:10 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * arscan.c (ar_name_equal): Don't compare [MAX-3..MAX] if - NAMELEN != MEMLEN. - -Thu Aug 13 17:50:09 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.18. - - * main.c: Don't #include ; make.h already does. - -Mon Aug 10 17:03:01 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * implicit.c (pattern_search): Fixed copying of suffix when building - also_make elts. - - * function.c (expand_function: `shell'): Make sure BUFFER is - null-terminated before replacing newlines. - - * compatMakefile (mandir): Use man$(manext), not always manl. - -Sun Aug 2 01:42:50 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * rule.c (new_pattern_rule): Not static. - * rule.h: Declare it. - - * file.c (file_hash_enter): New function, most code from rename_file. - (rename_file): Call it. - * file.h (file_hash_enter): Declare it. - - * dep.h: Doc fix. - -Thu Jul 30 15:40:48 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (decode_switches): Handle usage_and_exit when building - long options vector. - - * default.c (default_terminal_rules): Make RCS rules use $(CHECKOUT,v). - (default_variables): Define CHECKOUT,v (hairy). - - * make.h [!HAVE_SYS_SIGLIST && HAVE__SYS_SIGLIST]: #define - sys_siglist to _sys_siglist. - -Sun Jul 26 16:56:32 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * NEWS: Add header and tail copyright info like Emacs NEWS. - - * make.h [ANSI_STRING]: Don't #define index, rindex, bcmp, bzero, - bcopy if already #define'd. - [STDC_HEADERS] (qsort, abort, exit): Declare here. - [! __GNU_LIBRARY__ && !POSIX]: Not here. - - * make.h [_AIX]: #pragma alloca first thing. - - * job.c (start_waiting_job): Set the command_state to cs_running - when we queue a job on waiting_jobs. - -Fri Jul 24 02:16:28 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.c (define_automatic_variables): Use "" instead of nil - for empty value. - -Thu Jul 23 22:31:18 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.17. - - * main.c (struct command_switch.type): Add alternative usage_and_exit. - (command_switches): Add -h/--help. - -Thu Jul 16 14:27:50 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * GNUmakefile (make-$(version).tar.Z): Include NEWS, not CHANGES. - * README.template: Mention NEWS. - * CHANGES: Renamed to NEWS. - - * main.c [! STDC_HEADERS] [sun]: Don't declare exit. - -Tue Jul 14 18:48:41 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (main): Set -o files' command_states to cs_finished. - - * rule.c (count_implicit_rule_limits): Decrement num_pattern_rules - when tossing a rule. - - * main.c (main): Use alloca only in simple local var assignment, - for braindead SGI compiler. - - * rule.c (print_rule_data_base): Barf if num_pattern_rules is - inconsistent with the number computed when listing them. - -Mon Jul 13 17:51:53 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * commands.c (set_file_variables): For $? and $^ elts that are archive - member refs, use member name only. - -Fri Jul 10 00:05:04 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * variable.h (struct variable.export): Add new alternative v_ifset. - * variable.c (target_environment): Check for it. - (define_automatic_variables): Set it for MAKEFILES. - -Thu Jul 9 21:24:28 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (objs): Remove getloadavg.o; $(extras) gets it. - (remote.o): Use $(srcdir)/remote.c, not $remote.c<. - (distclean, mostlyclean): New targets. - -Tue Jul 7 19:12:49 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.16. - - * compatMakefile (config.status): Remove rule. - - * job.c (start_waiting_job): Free C after using C->file, not before. - -Sat Jul 4 20:51:49 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * commands.c, job.c, main.c, make.h, remote-cstms.c: Use #ifdef - HAVE_* instead of #ifndef *_MISSING. - * configure.in: Use AC_HAVE_FUNCS instead of AC_MISSING_FUNCS (gone). - -Thu Jul 2 18:47:52 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * main.c (main): makelevel>0 or -C implies -w. - -Tue Jun 30 20:50:17 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * file.c, job.c, function.c: Don't #include . - make.h: Do it here instead. - * arscan.c (ar_member_touch): Don't declare errno. - -Thu Jun 25 17:06:55 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * GNUmakefile (make-$(version).tar.Z): Depend on INSTALL, configure.in. - - * remake.c (update_file): If commands or deps are running after - update_file_1 returns, break out of the :: rule (->prev) loop and - just return. - - * job.c (job_next_command): New function; code from start_job. - (start_job_command): Renamed from start_job. Call job_next_command - and recurse for empty command lines and -n. - (start_waiting_job): Call start_job_command, not start_job. - (new_job): Call job_next_command to prime the child structure, and - then call start_waiting_job. - (reap_children): Use job_next_command and start_job_command. - (start_waiting_job): Call start_remote_job_p here, and store its - result in C->remote. If zero, check the load average and - maybe put C on waiting_jobs. - (start_job_command): Test CHILD->remote rather than calling - start_remote_job_p. Don't do load avg checking at all here. - - * main.c (main): Don't handle SIGILL, SIGIOT, SIGEMT, SIGBUS, - SIGSEGV, SIGFPE or SIGTRAP. - - * compatMakefile (glob/libglob.a): Don't pass srcdir to sub-make. - configure will set it in glob/Makefile. - -Wed Jun 24 19:40:34 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * dir.c [DIRENT] (direct): Don't define to dirent. - [! DIRENT] (direct): Define to dirent. - (dir_file_exists_p): Use struct dirent instead of struct direct. - - * make.h (getcwd): No space between macro and ( for args! - - * job.c (start_job): Don't put the job on waiting_jobs if - job_slots_used==0. - - * make.texinfo (Missing): Shortened title. - -Tue Jun 23 18:42:21 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * file.c (remove_intermediates): Print "rm" commands under -n. - -Mon Jun 22 16:20:02 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.15. - -Fri Jun 19 16:20:26 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * arscan.c [M_UNIX]: #undef M_XENIX. - -Wed Jun 17 17:59:28 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * default.c (default_terminal_rules): Put @ prefix on RCS cmds. - -Tue Jun 16 19:24:17 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile (getloadavg.o): Removed special rule. - (CFLAGS): Don't include $(defines). - (.c.o): Define suffix rule. - (glob/libglob.a): Pass CPPFLAGS=$(defines) to submake. - (GETOPT_SRC, srcs, tagsrcs): Prefix files with $(srcdir)/. - - * arscan.c (ar_name_equal): Moved local vars inside #if'd block. - - * make.h (max): Removed. - * expand.c (variable_buffer_output): Don't use it. - - * compatMakefile (INSTALL): Define. - (Makefile): New rule to make from Makefile.in. - (srcdir): Define. - (VPATH): Define. - (getloadavg.o, remote.o): Use autoconf $foo< hack. - - * commands.c (fatal_error_signal): Removed return. - -Mon Jun 15 17:42:51 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.14. - - * make.texinfo (Summary): New node. - (Special Targets): Mention .EXPORT_ALL_VARIABLES here. - - * variable.c (max): Moved to make.h. - - * compatMakefile (objs, srcs): Added ar & arscan. - - * job.c (start_waiting_job): New function, 2nd half of new_job. - (new_job): Call it. - (start_waiting_jobs): New function. - * remake.c (update_goal_chain): Call start_waiting_jobs at the top - of the main loop. - * compatMakefile (objs, srcs): Removed load, added getloadavg. - -Fri Jun 12 19:33:16 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * job.c (load_too_high): New function. Uses getloadavg. - (waiting_jobs): New variable. - (start_job): Don't call wait_to_start_job. Instead, if - load_too_high returns nonzero, add the child to the - `waiting_jobs' chain and return without starting the job. - -Thu Jun 11 00:05:28 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * expand.c (variable_buffer_output): Made global again. - * variable.h: And declare it. - - * arscan.c (PORTAR): Define for all systems if PORT5AR is not defined. - (AR_NAMELEN, AR_TRAILING_SLASH): Removed. - (ar_scan): Don't use it. Don't #ifdef AR_TRAILING_SLASH; just look - for a slash in the archive at run time. - (ar_name_equal): Rewrote .o hacking to not use AR_NAMELEN, and to - cope with trailing-slash and non-trailing-slash archives. - - * main.c (main) [! SETVBUF_REVERSED]: Test this instead of USGr3 et al. - [SETVBUF_REVERSED]: Always allocate a buffer ourselves. - - * load.c (load_average) [sgi]: Use sysmp call. - - * compatMakefile (INSTALL_DATA, INSTALL_PROGRAM): Define. - ($(bindir)/$(instname), $(mandir)/make.$(manext)): Use them. - - * make.h [HAVE_VFORK_H]: #include . - (vfork, VFORK_NAME): Don't define. - * job.c (start_job): Use "vfork" in place of VFORK_NAME. - - * make.h [HAVE_LIMITS_H, HAVE_SYS_PARAM_H]: If #define'd, #include - the each file. Rearranged PATH_MAX hacking. - * job.c: Rearranged NGROUPS_MAX hacking. - - * remake.c (fstat, time): Don't declare. - - * compatMakefile (defines): Value is @DEFS@. - (LOADLIBES): Value is @LIBS@. - (extras): Value is @LIBOBJS@. - (ARCHIVES, ARCHIVES_SRC, ALLOCASRC): Removed. - * arscan.c, ar.c: Surround body with #ifndef NO_ARCHIVES. - - * misc.c [! HAVE_UNISTD_H]: Test instead of !POSIX to decl get*id. - - * make.h [GETCWD_MISSING]: Test instead of !USG && !POSIX et al. - (getcwd): Just declare if present. If not, declare as a macro - using getwd, and declare getwd. - [PATH_MAX] (GET_PATH_MAX): #define to PATH_MAX. - * main.c (main, log_working_directory): Use getcwd instead of getwd. - - * main.c (main) [SETLINEBUF_MISSING]: Test this instead of USG. - - * make.h (SIGHANDLER, SIGNAL): Removed. - (RETSIGTYPE): Define if not #define'd. - * main.c (main): Use signal in place of SIGNAL. - - * main.c [SYS_SIGLIST_MISSING]: Test instead of USG. - - * job.c (search_path) [GETGROUPS_MISSING]: Test instead of USG. - [HAVE_UNISTD_H]: Test instead of POSIX to not decl getgroups. - - * main.c [! HAVE_UNISTD_H]: Test instead of !POSIX to decl chdir. - [! STDC_HEADERS]: Test instead of !POSIX to decl exit & atof. - - * job.c (child_handler), commands.c (fatal_error_signal): Return - RETSIGTYPE instead of int. - * main.c (main): Declare fatal_error_signal and child_handler here - to return RETSIGTYPE; removed top-level decl of former. - - * commands.c (fatal_error_signal), job.c (unblock_sigs, start_job), - main.c [SIGSETMASK_MISSING]: Test this instead of USG. - -Wed Jun 10 22:06:13 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * job.c [HAVE_WAITPID]: Test this instead of USG. - [! HAVE_UNISTD_H]: Test this instead of !POSIX to declare misc fns. - (GID_T): Don't #define. - (search_path): Use gid_t instead of GID_T. - [GETDTABLESIZE_MISSING, SYS_SIGLIST_MISSING, DUP2_MISSING]: Test - these individually instead of USG for all. - * make.h (ctime): Don't declare. #include time.h instead. - [HAVE_UNISTD_H]: #include and #define POSIX #ifdef - _POSIX_VERSION. - * dir.c [__GNU_LIBRARY__] (D_NAMLEN): Define to use d_namlen member. - * make.h [NEED_MEMORY_H]: Only include memory.h #ifdef this. - - * arscan.c: Removed #ifdef mess about string.h et al. - Just #include make.h instead. - * make.h (fstat, atol): Declare. - - * commands.c (fatal_error_signal): Don't use sigmask to check for - propagated signals; use ||s instead. - (PROPAGATED_SIGNAL_MASK): Removed. - (fatal_error_signal) [POSIX]: Use sigprocmask in place of sigsetmask. - - * variable.c (variable_buffer, variable_buffer_length, - initialize_variable_output, variable_output): Moved to expand.c; - made all static. - (struct output_state, save_variable_output, - restore_variable_output): Removed. - * expand.c (initialize_variable_output): Put a NUL at the beginning - of the new buffer after allocating it. - (allocated_variable_expand_for_file): Don't use - {save,restore}_variable_output. Do it by hand instead, keeping - state on the stack instead of malloc'ing it. - (allocated_variable_expand): Removed. - * variable.h (allocated_variable_expand): Define here as macro. - (variable_buffer_output, initialize_variable_output, - save_variable_output, restore_variable_output): Removed decls. - - * read.c (conditional_line): For an if cmd, if any elt of the - conditionals stack is ignoring, just push a new level that ignores - and return 1; don't evaluate the condition. - -Thu Jun 4 21:01:20 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (main): Put #ifdef's around frobbing SIGSYS and SIGBUS. - - * job.c (getdtablesize): Don't declare or #define if already #define'd. - -Wed Jun 3 23:42:36 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * file.c (snap_deps): If `.EXPORT_ALL_VARIABLES' is a target, set - export_all_variables. - * make.texinfo (Variables/Recursion): Document .EXPORT_ALL_VARIABLES. - -Tue Jun 2 21:08:35 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.13. - - * commands.c (set_file_variables): Calculate length for ^D and ?D - individually, making sure to give them at least enough space for "./". - - * make.h [CRAY]: #define signal to bsdsignal. - - * default.c (default_variables) [CRAY]: Define PC, SEGLDR, - CF77PPFLAGS, CF77PP, CFT, CF, and FC. - - * arscan.c (AR_HDR_SIZE): Define to sizeof (struct ar_hdr), if it - wasn't defined by . - -Thu May 28 00:56:53 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.12. - -Tue May 26 01:26:30 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * rule.c (new_pattern_rule): Initialize LASTRULE to nil, not - pattern_rules. - -Mon May 25 19:02:15 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (decode_switches): Initialize all the long_option elt members. - -Thu May 21 16:34:24 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * make.texinfo (Text Functions): Correct filter-out description. - -Tue May 19 20:50:01 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * compatMakefile (realclean): Don't remove backup files. - - * main.c (decode_switches): Allocate ARGC+1 elts in `other_args'. - -Sun May 17 16:38:48 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.62.11. - -Thu May 14 16:42:33 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * job.c (reap_children): Don't die if wait returns EINTR. - -Wed May 13 18:28:25 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * job.c (reap_children): Always run the next command for a - successful target. If we are going to die, we don't want to leave - the target partially made. - -Tue May 12 00:39:19 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): After loop, if we only - have one word, check it for being a shell command. - - * main.c (decode_switches): Allocate ARGC slots in other_args to - begin with, so we never need to worry about growing it. - If we get a non-option arg and POSIXLY_CORRECT is in the - environment, break out of the loop. After the loop, add all remaining - args to other_args list. - - * main.c (decode_switches): For positive_int and floating switches - when optarg is nil, use next arg if it looks right (start with a - digit, or maybe decimal point for floating). - - * variable.c (define_automatic_variables): Always set SHELL to - default if it comes from the environment. Set its export bit. - * make.texinfo (Environment): Document change. - -Mon May 11 00:32:46 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.62.10. - - * compatMakefile (tags, TAGS): Use vars for cmds. - (ETAGS, CTAGS): Define. - - * main.c (decode_switches): If a switches elt has a nil long_name, - make the long option name elt be "". - Fixed loop to not ignore all the options. - - * make.texinfo (Option Summary): Added long options. - - * main.c (switches): Changed -m's description to "-b". - (decode_switches): When printing the usage message, don't print - switches whose descriptions start with -. - When constructing the list of names for switch -C, search the - switches vector for switches whose descriptions are "-C". - - * main.c (switches): Call -S --no-keep-going, not --dont-keep-going. - Call -I --include-dir, not --include-path. - (long_option_aliases): Added --new == -W, --assume-new == -W, - --assume-old == -o, --max-load == -l, --dry-run == -n, --recon == -n, - --makefile == -f. - - * main.c (switches): Removed bogus "silent" elt. - (long_option_aliases): Define new var. - (decode_switches): Add long_option_aliases onto the end of the long - options vector created for getopt_long. - Look through long_option_aliases for extra names to list - in usage message. - -Sat May 9 00:21:05 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (log_working_directory): Fixed to properly not print the - leaving message when we haven't printed the entering message. - -Fri May 8 21:55:35 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * main.c (struct command_switch): Added elts `long_name', - `description', and `argdesc'. - (switches): Added initializers for new members. - (decode_switches): Rewritten to use getopt_long. - * compatMakefile (GETOPT, GETOPT_SRC): Define. - (objs, srcs): Include them. - - * job.c (child_died): Renamed to dead_children; made static. - (child_handler): Increment dead_children instead of setting child_died. - (reap_children): Decrement dead_children instead of clearing - child_died. The point of all this is to avoid printing "waiting - for unfinished jobs" when we don't actually need to block. - This happened when multiple SIGCHLDs before reap_children was called. - - * job.c (reap_children): If ERR is set, so we don't call start_job - on the child being reaped, instead set its command_state to - cs_finished. - (reap_children, child_handler, new_job): I added several - debugging printf's while fixing this. I left them in if (debug_flag) - because they may be useful for debugging this stuff again. - -Wed May 6 22:02:37 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * read.c (read_makefile): v_export is not 1. - -Mon May 4 17:27:37 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.9. - - * variable.c (export_all_variables): New variable. - (target_environment): Export variables whose `export' member is - v_default if export_all_variables is set and their names are benign. - * variable.h: Declare export_all_variables. - * read.c (read_makefile): If export or unexport is given with no - args, set or clear export_all_variables, respectively. - - * variable.c (target_environment): Exclude MAKELEVEL in the loop, - so it isn't duplicated when we add it at the end. - -Sun May 3 17:44:48 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.8. - - * variable.h (struct variable): Added new member `export'. - * variable.c (define_variable_in_set): Initialize it to v_default. - (target_environment): Don't check for .NOEXPORT. - Export variables whose `export' member is v_default and that would - have been exported under .NOEXPORT, and variables whose `export' - member is v_export. - (try_variable_definition): Return the variable defined. - * variable.h (try_variable_definition): Changed decl. - * read.c (read_makefile): Recognize `export' and `unexport' directives. - -Fri May 1 11:39:38 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * main.c (main) [POSIX]: Reversed args to sigaddset. - -Thu Apr 30 17:33:32 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * job.c [POSIX || !USG] (unblock_sigs): New fn. - (start_job): Block signals before forking. - (new_job): Unblock signals after putting the new child on the chain. - * main.c (main) [POSIX]: Use sigset_t fatal_signal_set instead of - int fatal_signal_mask. - - * load.c [sgi] (LDAV_CVT): Define. - -Wed Apr 29 17:15:59 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.62.7. - - * load.c (load_average) [sgi]: Clear the high bit of the address - from the symbol table before looking it up in kmem. - - * misc.c (fatal, makefile_fatal): Put *** in fatal error messages. - (remake_file): No longer needed in message here. - - * main.c (die): Call reap_children with BLOCK==1. - -Tue Apr 28 20:44:35 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * rule.c (freerule): Don't set LASTRULE->next if LASTRULE is nil. - -Sun Apr 26 15:09:51 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * rule.c (count_implicit_rule_limits): Initialize LASTRULE to nil, - not to head of chain. Extract next ptr before we might do - freerule, and use that for next iteration. - (freerule): Still do next ptr frobbing if LASTRULE is nil. - -Tue Apr 21 03:16:29 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * job.c (child_error): Removed extra %s from error msg format. - - * Version 3.62.6. - - * job.c (reap_children): Don't start later commands in a sequence - if ERR is nonzero. - - * job.c (new_job): Always call reap_children with BLOCK==0 first thing. - - * job.c (reap_children): New function; work that used to be done in - child_handler. - (child_died): New global var. - (child_handler): Now just sets child_died. - (wait_for_children): Removed. - (unknown_children_possible, block_signals, unblock_signals, - push_signals_blocked_p, pop_signals_blocked_p): Removed. - (child_execute_job): Removed call to unblock_signals. - (new_job): Removed calls to push_signals_blocked_p and - pop_signals_blocked_p. - * job.h: Declare reap_children, not wait_for_children. - * commands.c (fatal_error_signal), job.c (new_job), - load.c [LDAV_BASED] (wait_to_start_job), main.c (die), - remake.c (update_goal_chain), function.c (expand_function: `shell'): - Changed wait_for_children calls to reap_children. - Some needed to be loops to wait for all children to die. - * commands.c (fatal_error_signal), main.c (main, - log_working_directory), function.c (expand_function): Removed calls - to push_signals_blocked_p and pop_signals_blocked_p. - * job.h: Removed decls. - - * job.h: Added copyright notice. - -Wed Apr 15 02:02:40 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (child_error): No *** for ignored error. - -Tue Apr 14 18:31:21 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * implicit.c (DEBUGP2): Use do ... while (0) instead of if ... else to - avoid compiler warnings. - - * read.c (parse_file_seq): Don't remove ./ when it is followed by a - blank. - -Mon Apr 13 21:56:15 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h (DEBUGPR): Use do ... while (0) instead of if ... else to - avoid compiler warnings. - - * remake.c (notice_finished_file): Run file_mtime on the also_make - files, so vpath_search can happen. - - * GNUmakefile (tests): Use perl test suite from csa@sw.stratus.com. - (alpha-files): Include test suite tar file. - -Fri Apr 3 00:50:13 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * Version 3.62.5. - -Wed Apr 1 05:31:18 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * remake.c (update_file, update_file_1): Do check_renamed on elts - of dep chains when traversing them. Something unrelated might have - renamed one of the files the dep chain points to. - - * file.c (rename_file): If FILE has been renamed, follow its - `renamed' ptr, so we get to the final real FILE. Using the renamed - ones loses because they are not in the hash table, so the removal - code loops infinitely. - - * read.c (read_all_makefiles): Clobber null terminator into - MAKEFILES expansion, so string passed to read_makefile is properly - terminated. - -Mon Mar 30 20:18:02 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * commands.c (set_file_variables): $* for archive member with - explicit cmds is stem of member, not of whole `lib(member)'. - -Thu Mar 26 15:24:38 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.62.4. - -Tue Mar 24 05:20:51 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * rule.c (new_pattern_rule): Rules are identical only if all their - targets match (regardless of order). - -Wed Mar 11 13:49:54 1992 Roland McGrath (roland@geech.gnu.ai.mit.edu) - - * remake.c (remake_file): Changed error "no way to make" to "no - rule to make". Fiat Hugh. - - * make.texinfo (Last Resort): Describe %:: rules and new .DEFAULT - behavior. - - * remake.c (update_file_1): Only use .DEFAULT cmds if FILE is not a - target. - -Tue Mar 10 18:13:13 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * remote-stub.c, remote-cstms.c (start_remote_job): Take new arg, - environment to pass to child. - * job.c (start_job): Pass it. - -Mon Mar 9 19:00:11 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * file.c (enter_file): Also strip ./s here, to get command-line - target names. - - * remote-cstms.c: Add comment telling people to leave me alone. - - * compatMakefile (manpage install): Remove target before copying. - -Tue Mar 3 18:43:21 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.texinfo (Missing): Renamed to "Incompatibilities and ...". - Added paragraph describing $? incompatibility with Unix and POSIX.2. - -Sun Mar 1 15:50:54 1992 Roland McGrath (roland@nutrimat.gnu.ai.mit.edu) - - * function.c (expand_function: `shell'): Don't declare fork or pipe. - Use vfork instead of fork. - -Tue Feb 25 22:05:32 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * make.texinfo (Chained Rules): Clarify .PRECIOUS to save - intermediate files. - - * load.c [sun] (LDAV_CVT): Define to divide by FSCALE. - -Sun Feb 16 02:05:16 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * Version 3.62.3. - -Sat Feb 15 17:12:20 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * compatMakefile (makeinfo): Use emacs batch-texinfo-format fn. - -Fri Feb 14 00:11:55 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * read.c (read_makefile): Correctly handle define & endef in ifdefs. - - * read.c (record_files): Pass arg for %s in error msg. - - * main.c (main) [__IBMR2, POSIX]: Use correct (a la USGr3) setvbuf - call. - -Wed Feb 12 12:07:39 1992 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * make.texinfo (Libraries/Search): Say it does /usr/local/lib too. - -Sun Feb 9 23:06:24 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * read.c (read_makefile): Check for extraneous `endef' when ignoring. - -Thu Feb 6 16:15:48 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * Version 3.62.2. - -Tue Feb 4 20:04:46 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Correctly ignore - whitespace after backslash-NL. - -Fri Jan 31 18:30:05 1992 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * compatMakefile: Ignore errors from chgrp and chmod when installing. - -Wed Jan 29 18:13:30 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * main.c (main): When setting MAKELEVEL in the env to re-exec, - allocate space so as not to clobber past the end of the old string. - - * make.h [HAVE_ALLOCA_H]: Include - * compatMakefile (defines): Document HAVE_ALLOCA_H. - -Mon Jan 20 13:40:05 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * make.h [VFORK_MISSING]: Use fork instead. - * compatMakefile (defines): Document same. - - * job.c (construct_command_argv_internal): Don't create an empty - arg if backslash-NL is at beginning of word. - -Sun Jan 19 16:26:53 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * main.c [DGUX]: Call setvbuf as for USGr3. - - * job.c (construct_command_argv_internal): Notice correctly that - backslash-NL is the end of the arg (because it is replaced with a - space). - -Thu Jan 16 18:42:38 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): If SHELL is nil, set it - to default_shell before proceeding. - - * make.h [sgi]: No alloca.h, after all. - -Wed Jan 15 12:30:04 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * read.c (multi_glob): Cons up the chain of the results of glob - from back to front, so it comes out in forward order. - - * job.c (construct_command_argv_internal): Don't eat char following - backslash-NL. - -Mon Jan 13 19:16:56 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * Version 3.62.1. - - * default.c (default_variables) [ultrix]: GET=get, like USG. - - * job.c (construct_command_argv_internal): Remove tabs following - backslash-NL combos in the input line, so they don't show up when - that line is printed. - - * read.c (read_makefile): Don't collapse_continuations the line on - input; do it on the copy we do remove_comments on. - For rule lines, collapse_continuations the line after chopping - ";cmds" off the end, so we don't eat conts in the cmds. - Give error for ";cmds" with no rule. - * job.c (construct_command_argv_internal): Eat backslash-NL combos - when constructing the line to recurse on for slow, too. - -Sat Jan 11 02:20:27 1992 Roland McGrath (roland@albert.gnu.ai.mit.edu) - - * file.c (enter_file): Don't strip leading `./'s. - * read.c (parse_file_seq): Take new arg STRIP; if nonzero, do it here. - * default.c (set_default_suffixes), function.c (string_glob), - read.c (read_makefile), rule.c (install_pattern_rule): Change callers. - - * default.c (default_variables) [_IBMR2]: FC=xlf - - * job.c (construct_command_argv_internal): Turn backslash-NL and - following whitespace into a single space, rather than just eating - the backslash. - - * make.texinfo (Copying): @include gpl.texinfo, rather than - duplicating its contents. - -Fri Nov 8 20:06:03 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Make sure not to bother - processing an empty line. - - * Version 3.62.0. - - * job.c (construct_command_argv_internal): Always recurse for slow; - simple case didn't handle finding newlines. - -Tue Nov 5 18:51:10 1991 Roland McGrath (roland@wookumz.gnu.ai.mit.edu) - - * job.c (construct_command_argv_internal): Set RESTP properly when - slow; don't \ify past a newline. - -Fri Nov 1 19:34:28 1991 Roland McGrath (roland@churchy.gnu.ai.mit.edu) - - * make.h [sgi]: #include . - - - -See ChangeLog.1 for earlier changes. diff --git a/src/gmake/INSTALL b/src/gmake/INSTALL deleted file mode 100644 index bca44d04..00000000 --- a/src/gmake/INSTALL +++ /dev/null @@ -1,187 +0,0 @@ -Basic Installation -================== - - 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, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). - - 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 at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. - - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' 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. - - If you're building GNU make on a system which does not already have - a `make', you can use the build.sh shell script to compile. Run - `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. - - 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. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure - -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 supports 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=PATH'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH 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=PATH' 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' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: - CPU-COMPANY-SYSTEM - -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 host type. - - If you are building compiler tools for cross-compiling, you can also -use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. - -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. - -Operation Controls -================== - - `configure' recognizes the following options to control how it -operates. - -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. - -`--help' - Print a summary of the options to `configure', and exit. - -`--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. - -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`configure' also accepts some other, not widely useful, options. - diff --git a/src/gmake/Makefile.DOS.template b/src/gmake/Makefile.DOS.template deleted file mode 100644 index a5a86477..00000000 --- a/src/gmake/Makefile.DOS.template +++ /dev/null @@ -1,533 +0,0 @@ -# -*-Makefile-*- template for DJGPP -# Makefile.in generated automatically by automake 1.2 from Makefile.am - -# Copyright (C) 1994, 1995-1998, 1999, 2002 Free Software Foundation, Inc. -# This Makefile.DOS is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - - -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 = %VERSION% - -AUTOMAKE_OPTIONS = 1.2 - -bin_PROGRAMS = %PROGRAMS%$(EXEEXT) - -make_SOURCES = %SOURCES% -# This should include the glob/ prefix -libglob_a_SOURCES = %GLOB_SOURCES% -make_LDADD = glob/libglob.a - -info_TEXINFOS = make.texinfo -man_MANS = make.1 - -INCLUDES = -I$(srcdir)/glob -DLIBDIR=\"c:/djgpp/lib\" -DINCLUDEDIR=\"c:/djgpp/include\" -DLOCALEDIR=\"$(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 - -SUBDIRS = glob -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 = %OBJECTS% -make_DEPENDENCIES = glob/libglob.a -make_LDFLAGS = -libglob_a_LIBADD = -libglob_a_OBJECTS = %GLOB_OBJECTS% -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 = make.info -DVIS = make.dvi -TEXINFOS = make.texinfo -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.in 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 .texinfo .tex - -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) - -make.info: make.texinfo -make.dvi: make.texinfo - - -DVIPS = dvips - -.texinfo.info: - @command.com /c if exist make.info* del make.info* - @command.com /c if exist make.i* del make.i* - $(MAKEINFO) -I$(srcdir) $< -o ./$@ - -.texinfo: - @command.com /c if exist make.info* del make.info* - @command.com /c if exist make.i* del make.i* - $(MAKEINFO) -I$(srcdir) $< -o ./$@ - -.texinfo.dvi: - TEXINPUTS="$(srcdir);$$TEXINPUTS" MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - - -.dvi.ps: - $(DVIPS) $< -o $@ - -install-info-am: $(INFO_DEPS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(infodir) - @for file in $(INFO_DEPS) make.i; do d=$(srcdir); for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9] $$file[0-9] $$file[0-9][0-9]`; do if test -f $$d/$$ifile; then echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile"; $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile; 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 echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file"; install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :; 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) make.i; do (cd $(DESTDIR)$(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9] $$file[0-9] $$file[0-9][0-9]); 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 make.aux make.cp make.cps make.dvi make.fn make.fns make.ky \ - make.kys make.ps make.log make.pg make.toc make.tp make.tps \ - make.vr make.vrs make.op make.tr make.cv make.cn - -clean-aminfo: - -distclean-aminfo: - -maintainer-clean-aminfo: - for i in $(INFO_DEPS) make.i; do rm -f `eval echo $$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 ($(words $(SUBDIRS)), 1) - @command.com /c if not exist glob\\nul md glob - @echo Making all in $(SUBDIRS) - $(MAKE) -C $(SUBDIRS) -f ../Makefile INCLUDES='-I$(srcdir) -I$(srcdir)/glob' DEFS='-I.. -I$(srcdir)' VPATH=$(srcdir)/glob libglob.a -else - @echo FATAL: There is more than one directory in "($(SUBDIRS))" - @$(EXIT_FAIL) -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)), 1) - @echo Making $(shell echo $@ | sed s/-recursive//) in $(SUBDIRS) - $(MAKE) -C $(SUBDIRS) -f ../Makefile $(shell echo $@ | sed s/-recursive//)-am -else - @echo FATAL: There is more than one directory in "($(SUBDIRS))" - @$(EXIT_FAIL) -endif - -tags-in-glob: $(libglob_a_SOURCES) - etags $(addprefix $(srcdir)/,$^) -o ./glob/TAGS - -tags-recursive: -ifeq ($(words $(SUBDIRS)), 1) - $(MAKE) tags-in-glob -else - @echo FATAL: There is more than one 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_DEPS) info-recursive -dvi: $(DVIS) dvi-recursive -check: all-am check-recursive check-local - @: -installcheck: installcheck-recursive -all-recursive-am: config.h - $(MAKE) all-recursive - -all-am: Makefile $(INFO_DEPS) $(PROGRAMS) config.h - -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 - - -# --------------- Local DIST Section - -# Install the w32 subdirectory -# -dist-hook: - (cd $(srcdir); \ - w32=`find w32 -follow \( -name CVS -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 diff --git a/src/gmake/Makefile.am b/src/gmake/Makefile.am deleted file mode 100644 index 322f52a1..00000000 --- a/src/gmake/Makefile.am +++ /dev/null @@ -1,167 +0,0 @@ -# This is a -*-Makefile-*-, or close enough - -AUTOMAKE_OPTIONS = 1.7.6 dist-bzip2 check-news ansi2knr -ACLOCAL_AMFLAGS = -I config - -SUBDIRS = glob config po doc - -bin_PROGRAMS = make - -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 implicit.c job.c main.c \ - misc.c read.c remake.c $(remote) rule.c signame.c \ - variable.c version.c vpath.c hash.c - -EXTRA_make_SOURCES = remote-stub.c remote-cstms.c - -noinst_HEADERS = commands.h dep.h filedef.h job.h make.h rule.h variable.h \ - debug.h getopt.h gettext.h hash.h - -make_LDADD = @LIBOBJS@ @ALLOCA@ $(GLOBLIB) @GETLOADAVG_LIBS@ @LIBINTL@ - -man_MANS = make.1 - -DEFS = -DLOCALEDIR=\"$(localedir)\" -DLIBDIR=\"$(libdir)\" -DINCLUDEDIR=\"$(includedir)\" @DEFS@ - -AM_CPPFLAGS = $(GLOBINC) - - -# Extra stuff to include in the distribution. -# Note we need all the glob stuff here, rather than in glob/Makefile.am, -# because often that directory isn't built on the systems used by the -# maintainers. - -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 \ - readme.vms makefile.vms makefile.com config.h-vms \ - vmsdir.h vmsfunctions.c vmsify.c - -MAKE_HOST = @MAKE_HOST@ - - -# Forward targets - -html: - cd doc && $(MAKE) $(AM_MAKEFLAGS) $@ - -.PHONY: html - -# --------------- Internationalization Section - -localedir = $(datadir)/locale - -# We need this due to a bug in gettext 0.12.1 Makefile.in.in: without this I -# can't run distcheck because this file is created but not removed during -# distclean. - -distclean-local: - test "$(srcdir)" = . || rm -f po/stamp-po - -# --------------- 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 - -# --------------- Local DIST Section - -# Install the w32 and tests subdirectories -# -dist-hook: - (cd $(srcdir); \ - sub=`find w32 tests -follow \( -name CVS -prune -o -name .cvsignore -o -name work -prune \) -o \( -name \*.orig -o -name \*.rej -o -name \*~ -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 - @echo The system uptime program believes the load average to be: - -uptime - @echo The GNU load average checking code thinks: - -./loadavg - -# The loadavg function is invoked during "make check" to test getloadavg. -noinst_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: - @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 -make ../make $(MAKETESTFLAGS)"; \ - cd tests && $(PERL) ./run_make_tests.pl -make ../make $(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 - -@MAINT_MAKEFILE@ diff --git a/src/gmake/Makefile.ami b/src/gmake/Makefile.ami deleted file mode 100644 index 6a2a2bc1..00000000 --- a/src/gmake/Makefile.ami +++ /dev/null @@ -1,305 +0,0 @@ -# NOTE: If you have no `make' program at all to process this makefile, run -# `build.sh' instead. -# -# Copyright (C) 1988, 89, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. -# This file is part of GNU Make. -# -# GNU Make is free software; you can 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. -# -# GNU Make is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Make; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. - -# -# 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 - -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 hash.o \ - remote-$(REMOTE).o $(GETOPT) $(ALLOCA) $(extras) -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)remote-$(REMOTE).c \ - $(srcdir)ar.c $(srcdir)arscan.c \ - $(srcdir)signame.c $(srcdir)signame.h $(GETOPT_SRC) \ - $(srcdir)commands.h $(srcdir)dep.h $(srcdir)filedep.h \ - $(srcdir)job.h $(srcdir)make.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: - -tagsrcs = $(srcs) $(srcdir)remote-*.c - -.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 make.h dep.h filedef.h variable.h job.h \ - commands.h -job.o: job.c make.h job.h filedef.h commands.h variable.h -dir.o: dir.c make.h -file.o: file.c make.h dep.h filedef.h job.h commands.h variable.h -misc.o: misc.c make.h dep.h -main.o: main.c make.h dep.h filedef.h variable.h job.h commands.h \ - getopt.h -read.o: read.c make.h dep.h filedef.h job.h commands.h variable.h \ - glob/glob.h -remake.o: remake.c make.h filedef.h job.h commands.h dep.h -rule.o: rule.c make.h dep.h filedef.h job.h commands.h variable.h \ - rule.h -implicit.o: implicit.c make.h rule.h dep.h filedef.h -default.o: default.c make.h rule.h dep.h filedef.h job.h commands.h \ - variable.h -variable.o: variable.c make.h dep.h filedef.h job.h commands.h \ - variable.h -expand.o: expand.c make.h filedef.h job.h commands.h variable.h -function.o: function.c make.h filedef.h variable.h dep.h job.h \ - commands.h amiga.h -vpath.o: vpath.c make.h filedef.h variable.h -version.o: version.c -ar.o: ar.c make.h filedef.h dep.h -arscan.o: arscan.c make.h -signame.o: signame.c signame.h -remote-stub.o: remote-stub.c make.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 make.h variable.h amiga.h diff --git a/src/gmake/NEWS b/src/gmake/NEWS deleted file mode 100644 index 2a3ff8f0..00000000 --- a/src/gmake/NEWS +++ /dev/null @@ -1,880 +0,0 @@ -GNU make NEWS -*-indented-text-*- - History of user-visible changes. - 17 April 2003 - -Copyright (C) 2002,2003 Free Software Foundation, Inc. -See the end for copying 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. - -Please send GNU make bug reports to . -See the README file and the GNU make manual for details on sending bug -reports. - -Version 3.81rc1 - -* GNU make is ported to OS/2. - Port provided by Andreas Buening . - -* 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. - -* Enhancements for POSIX compatibility: - - Only touch targets (under -t) if they have at least one command. - -* Updated to autoconf 2.57, automake 1.7.6, and gettext 0.12.1. Users - should not be impacted. - - -Version 3.80 - -* 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. - -Version 3.79.1 - -* .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 - -* 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 - -* 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 - -* 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 - -* Small (but serious) bug fix. Quick rollout to get into the GNU source CD. - -Version 3.76 - -* 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 - -* 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 - -* 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 - -* 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 commands exit with a nonzero status, - just as when the commands get 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 - commands to update that file. Likewise if a file appears as a dependency - of `.SILENT', then the commands to update that file will not be printed - before they are run. (This change was made to conform to POSIX.2.) - -Version 3.71 - -* The automatic variables `$(@D)', `$(%D)', `$(*D)', `$(). - - 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 diff --git a/src/gmake/README.OS2.template b/src/gmake/README.OS2.template deleted file mode 100644 index eff2c0bc..00000000 --- a/src/gmake/README.OS2.template +++ /dev/null @@ -1,159 +0,0 @@ -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. As on - 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) - - 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.57, automake 1.7.2 (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 0x8000" 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 0x8000" - 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 or higher 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 -s -Zmt" - export LDFLAGS="-Zcrtdll -Zmt -s -Zlinker /exepack:2 -Zlinker /pm:vio -Zstack 0x8000" - export RANLIB="echo" - ./configure --prefix=x:/usr --disable-nls - make AR=emxomfar - make checks - -All tests should work fine with the exception of "default_names" which -is because OS/2 file systems are not case sensitive ("makefile" and -"Makefile" specify the same file). diff --git a/src/gmake/README.W32.template b/src/gmake/README.W32.template deleted file mode 100644 index 2b15584f..00000000 --- a/src/gmake/README.W32.template +++ /dev/null @@ -1,241 +0,0 @@ -Port of GNU make to Windows NT and Windows 95 -Builds natively with MSVC 2.x or MSVC 4.x compilers. -Should also build fine with MSVC 5.x and 6.x (though not confirmed). - -This Windows 32-bit port of GNU make is maintained primarily by Rob -Tulloh, who is also the author of this README. - -To build with nmake on Windows NT, Windows 95, or Windows 98: - - 1. Make sure cl.exe is in your %Path%. Example: - - set Path=%Path%;c:/msdev/bin - - 2. Make sure %include% is set to msvc include directory. Example: - - set include=c:/msdev/include - - 3. Make sure %lib% is set to msvc lib directory. Example: - - set lib=c:/msdev/lib - - 4. nmake /f NMakefile - - - A short cut to steps 1, 2, and 3 is to run VCVARS32.bat before - invoking namke. For example: - - c: - cd \msdev\bin - VCVARS32.bat - cd \path\to\make-%VERSION% - nmake /f NMakefile - -There is a bat file (build_w32.bat) for folks who have fear of nmake. - -Outputs: - - WinDebug/make.exe - WinRel/make.exe - - --- 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 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 version of Visual C++, - which is the predominant compiler used on Windows32 platforms. - - 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 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://sourceware.cygnus.com/cygwin). - Other possibilities are the MKS version of sh.exe, or building - your own with a package like NutCracker (DataFocus) or Portage - (Consensys). - -GNU make and brain-dead shells (BATCH_MODE_ONLY_SHELL): - - Some versions of Bourne shell does 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. - - 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%). - -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. - - 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-%VERSION% (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. - -Building GNU make on Windows NT and Windows 95/98 with Microsoft Visual C: - - I did not provide a Visual C project file with this port as - the project file would not be considered freely distributable - (or so I think). It is easy enough to create one, though, if - you know how to use Visual C. - - I build the program statically to avoid problems locating DLL's - on machines that may not have MSVC runtime installed. If you - prefer, you can change make to build with shared libraries by - changing /MT to /MD in the NMakefile (or in build_w32.bat). - - The program has not been built for non-Intel architectures (yet). - - I have not tried to build with any other compilers than MSVC. I - have heard that this is possible though so don't be afraid to - notify me of your successes! - -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 legal under 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 - 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. diff --git a/src/gmake/README.customs b/src/gmake/README.customs deleted file mode 100644 index 1976943e..00000000 --- a/src/gmake/README.customs +++ /dev/null @@ -1,95 +0,0 @@ - -*-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. diff --git a/src/gmake/README.cvs b/src/gmake/README.cvs deleted file mode 100644 index fc9cdd68..00000000 --- a/src/gmake/README.cvs +++ /dev/null @@ -1,113 +0,0 @@ - -*-text-*- - -Obtaining CVS Code ------------------- - -This seems redundant, since if you're reading this you most likely have -already performed this step; however, for completeness, you can obtain -the GNU make source code via anonymous CVS from the FSF's Savannah -project : - - $ cvs -d:pserver:anoncvs@subversions.gnu.org:/cvsroot/make co make - -You might want to use the "-z3" option to get compression, and you most -certainly will want the -P option to avoid unneeded directories -cluttering up your source. Personally I add these (as well as -dP for -update) to my ~/.cvsrc file. - - -If you have an older version of CVS, you might have to login first. -There is no password; just hit the ENTER key if you are asked for one. - - -Building From CVS ------------------ - -To build GNU make from CVS, you will need Autoconf 2.57 (or better), -Automake 1.7.3 (or better), and Gettext 0.11.5 (or better), and any -tools that those utilities require (GNU m4, Perl, etc.). You will also -need a copy of wget. - -After checking out the code, you will need to perform these steps to get -to the point where you can run "make". - - - 1) $ autoreconf -i -s - - This rebuilds all the things that need rebuilding, installing - missing files as symbolic links. - - You may get warnings here about missing files like README, etc. - Ignore them, they are harmless. - - - 2) $ ./configure - - Generate a Makefile - - - 3) $ make update - - Use wget to retrieve various other files that GNU make relies on, - but does not keep in its own source tree. - - NB: You may need GNU make to correctly perform this step; if you use - a platform-local make you may get problems with missing files in doc/. - - -At this point you have successfully brought your CVS copy of the GNU -make source directory up to the point where it can be treated -more-or-less like the official package you would get from ftp.gnu.org. -That is, you can just run: - - $ make && make check && make install - -to build and install GNU make. - - -Creating a Package ------------------- - -Once you have performed the above steps (including the configuration and -build) you can create a GNU make package. This is very simple, just -run: - - $ make dist-gzip - -and, if you like: - - $ make dist-bzip2 - -Even better, you should run this: - - $ make distcheck - -Which will build both .gz and .bz2 package files, then unpack them into -a temporary location, try to build them, and repack them, verifying that -everything works, you get the same results, _and_ no extraneous files -are left over after the "distclean" rule--whew!! Now, _that_ is why -converting to Automake is worth the trouble! A big "huzzah!" to Tom -T. and the AutoToolers! - - -That's it, you're done! - - -Appendix A - For The Brave --------------------------- - -For those of you who trust me implicitly, or are just brave (or -foolhardy), here is a canned sequence of commands to build a GNU make -distribution package from a virgin CVS source checkout (assuming all the -prerequisites are available of course). - -This list is eminently suitable for a quick swipe o' the mouse and a -swift click o' mouse-2 into an xterm. Go for it! - - -autoreconf -i -s -./configure -make update -make -make check -make distcheck diff --git a/src/gmake/README.template b/src/gmake/README.template deleted file mode 100644 index 969f2084..00000000 --- a/src/gmake/README.template +++ /dev/null @@ -1,164 +0,0 @@ -This directory contains the %VERSION% 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. - - -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_id=71 - -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 - - http://savannah.gnu.org/support/?group_id=71 - -You may also find interesting patches to GNU Make available here: - - http://savannah.gnu.org/patch/?group_id=71 - -Note these patches are provided by our users as a service and we make no -statements regarding their correctness. Please contact the authors -directly if you have a problem or suggestion for a patch available on -this page. - - -CVS Access ----------- - -The GNU make source repository is available via anonymous CVS from the -GNU Subversions CVS server; look here for details: - - http://savannah.gnu.org/cvs/?group_id=71 - -Please note: you won't be able to build GNU make from CVS without -installing appropriate maintainer's tools, such as GNU m4, automake, -autoconf, Perl, GNU make, and GCC. See the README.cvs 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 CVS -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. - -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! diff --git a/src/gmake/SCOPTIONS b/src/gmake/SCOPTIONS deleted file mode 100644 index f89daae1..00000000 --- a/src/gmake/SCOPTIONS +++ /dev/null @@ -1,13 +0,0 @@ -ERRORREXX -OPTIMIZE -NOVERSION -OPTIMIZERTIME -OPTIMIZERALIAS -DEFINE INCLUDEDIR="include:" -DEFINE LIBDIR="lib:" -DEFINE NO_ALLOCA -DEFINE NO_FLOAT -DEFINE NO_ARCHIVES -IGNORE=161 -IGNORE=100 -STARTUP=cres diff --git a/src/gmake/SMakefile.template b/src/gmake/SMakefile.template deleted file mode 100644 index 64c06853..00000000 --- a/src/gmake/SMakefile.template +++ /dev/null @@ -1,213 +0,0 @@ -# NOTE: If you have no `make' program at all to process this makefile, run -# `build.sh' instead. -# -# Copyright (C) 1988, 89, 91, 92, 93, 94, 1995 Free Software Foundation, Inc. -# This file is part of GNU Make. -# -# GNU Make is free software; you can 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. -# -# GNU Make is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Make; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. - -# -# Makefile for GNU Make -# - -# Ultrix 2.2 make doesn't expand the value of VPATH. -VPATH = /make-%VERSION%/ -# This must repeat the value, because configure will remove `VPATH = .'. -srcdir = /make-%VERSION%/ - -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 - -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 hash.o \ - remote-$(REMOTE).o $(GLOB) $(GETOPT) $(ALLOCA) $(extras) -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)remote-$(REMOTE).c \ - $(srcdir)ar.c $(srcdir)arscan.c \ - $(srcdir)signame.c $(srcdir)signame.h $(GETOPT_SRC) \ - $(srcdir)commands.h $(srcdir)dep.h $(srcdir)file.h \ - $(srcdir)job.h $(srcdir)make.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/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 $@ -< diff --git a/src/gmake/TODO.private b/src/gmake/TODO.private deleted file mode 100644 index 693b7bb5..00000000 --- a/src/gmake/TODO.private +++ /dev/null @@ -1,140 +0,0 @@ - -*-Indented-Text-*- -GNU Make TODO List ------------------- - -This list comes both from the authors and from users of GNU make. - -They are listed in no particular order! - -Also, I don't gaurantee that all of them will be ultimately deemed "good -ideas" and implemented. These are just the ones that, at first blush, -seem to have some merit (and that I can remember). - -However, if you see something here you really, really want, speak up. -All other things being equal, I will tend to implement things that seem -to maximize user satisfaction. - -If you want to implement some of them yourself, barring the ones I've -marked below, have at it! Please contact me first to let me know you're -working on it, and give me some info about the design--and, critically, -information about any user-visible syntax change, etc. - - -The Top Item ------------- - -If you know perl (or want to learn DejaGNU or similar), the number one -priority on my list of things I don't have time to do right now is -fixing up the GNU make test suite. Most importantly it needs to be made -"parallelizable", so more than one regression can run at the same time -(essentially, make the "work" directory local). Also, the CWD during -the test should be in the work directory or, better, a test-specific -temporary directory so each test gets a new directory; right now -sometimes tests leak files into the main directory which causes -subsequent tests to fail (some tests may need to be tweaked). Beyond -that, any cleanup done to make writing, reading, or handling tests -simpler would be great! Please feel free to make whatever changes you -like to the current tests, given some high-level goals, and that you'll -port the current tests to whatever you do :). - - -The Rest of the List --------------------- - - 1) Allow variables/functions to expand to other make rules which are - then interpreted, with newlines handled correctly. This is a - biggee, and is on my plate. I already have partially-working code. - - 2) Option to check more than timestamps to determine if targets have - changed. This is also a very big one. It's _close_ to my plate :), - and I have very definite ideas about how I would like it done. - Please pick something else unless you must have this feature. If - you try it, please work _extremely_ closely with me on it. - - 2a) Possibly a special case of this is the .KEEP_STATE feature of Sun's - make. Some great folks at W U. in Canada did an implementation of - this for a class project. Their approach is reasonable and - workable, but doesn't really fit into my ideas for #2. Maybe - that's OK. I have paperwork for their work so if you want to do - this one talk to me to get what they've already done. - - [K R Praveen ] - - 3) Currently you can use "%.foo %.bar : %.baz" to mean that one - invocation of the rule builds both targets. GNU make needs a way to - do that for explicit rules, too. I heard a rumor that some versions - of make all you to say "a.foo + a.bar : a.baz" to do this (i.e., a - "+" means one invocation builds both). Don't know if this is the - best syntax or not... what if you say "a.foo + a.bar a.bam : a.baz"; - what does that mean? - - 4) Multi-token pattern rule matching (allow %1/%2.c : %1/obj/%2.o, - etc., or something like that). I have an implementation of this - already, it just needs some refinement... maybe. Additionally I - think it only works for static pattern rules; it might need to be - fixed up to work with normal pattern rules, too. - - 5) More robust clock skew detection algorithm: less false hits. I have - some notes on this from various discussions. - - 6) Provide MAKETARGETS and MAKEVARIABLES variables, containing the - names of the targets and variables defined in the makefile. - - Actually, I now think a $(targets ...) function, at least, would be - better than a MAKETARGETS variable. The argument would be types of - targets to list: "phony" is the most useful one. I suppose - "default" might also be useful. Maybe some others; check the - bitfields to see what might be handy. This one is pretty easy. - - 7) Some sort of operating-system independent way of handling paths - would be outstanding, so makefiles can be written for UNIX, VMS, - DOS, MS-Windows, Amiga, etc. with a minimum of specialization. - - Or, perhaps related/instead of, some sort of meta-quoting syntax so - make can deal with filenames containing spaces, colons, etc. I - dunno, maybe something like $[...]? This may well not be worth - doing until #1 is done. - - 9) Right now the .PRECIOUS, .INTERMEDIATE, and .SECONDARY - pseudo-targets have different capabilities. For example, .PRECIOUS - can take a "%", the others can't. Etc. These should all work the - same, insofar as that makes sense. - -10) A syntax that specifies a build order _without_ implying a - dependency relationship. That is, a way to say "A must be built - before B" that doesn't force B to be built when A changes. This is - very important for parallel builds: sometimes you need some stuff - done first but you don't want to rebuild everything because of it. - -11) Improved debugging/logging/etc. capabilities. Part of this is done: - I introduced a number of debugging enhancements. Tim Magill is (I - think) looking into options to control output more selectively. - One thing I want to do in debugging is add a flag to allow debugging - of variables as they're expanded (!). This would be incredibly - verbose, but could be invaluable when nothing else seems to work and - you just can't figure it out. The way variables are expanded now - means this isn't 100% trivial, but it probably won't be hard. - -12) Integration of Guile as an embedded scripting language. This means: - allowing Guile functions to be declared in makefiles somehow, then - providing a syntax for invoking them. At least one formulation of - that would have the function resolve to a string which would be - substituted in the makefile, kind of like $(shell ...) does now, but - using the embedded interpreter so there's no process forked of - course. Obviously this is an optional add-on feature. - - It could be more advanced than that, even, who knows? Maybe make - could provide Guile functions that allow Guile scripts more direct - access to internal make structures, somehow. This kind of thing - needs a lot of thought. - - Also there's always the flip side: in some very fundamental ways - make isn't the best choice right now for a complex build tool. It's - great for simple-to-medium tasks, but there are already other tools - available for the really tough situations. Ask yourself, - realistically, how much work is worthwhile to add to make, given the - fundamentals you can't really overcome without significantly - affecting backward compatibility--and then why not use another tool - in the first place? - - Something to think about. diff --git a/src/gmake/acinclude.m4 b/src/gmake/acinclude.m4 deleted file mode 100644 index cd2b9037..00000000 --- a/src/gmake/acinclude.m4 +++ /dev/null @@ -1,164 +0,0 @@ -dnl acinclude.m4 -- Extra macros needed for GNU make. -dnl -dnl Automake will incorporate this into its generated aclocal.m4. - -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)]) -# -AC_CHECK_FUNCS(strcasecmp,,[ - CF_RECHECK_FUNC(strcasecmp,resolv,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 - -AC_DEFUN(AC_STRUCT_ST_MTIM_NSEC, - [AC_CACHE_CHECK([for nanoseconds field of struct stat.st_mtim], - ac_cv_struct_st_mtim_nsec, - [ac_save_CPPFLAGS="$CPPFLAGS" - ac_cv_struct_st_mtim_nsec=no - # tv_nsec -- the usual case - # _tv_nsec -- Solaris 2.6, if - # (defined _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED == 1 - # && !defined __EXTENSIONS__) - # st__tim.tv_nsec -- UnixWare 2.1.2 - for ac_val in tv_nsec _tv_nsec st__tim.tv_nsec; do - CPPFLAGS="$ac_save_CPPFLAGS -DST_MTIM_NSEC=$ac_val" - AC_TRY_COMPILE([#include -#include ], [struct stat s; s.st_mtim.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 - ] -) - - -dnl --------------------------------------------------------------------------- -dnl This will be in the next version of autoconf; take this out then! - -# make_FUNC_SETVBUF_REVERSED -# ------------------------ -AC_DEFUN([make_FUNC_SETVBUF_REVERSED], -[AC_REQUIRE([AC_C_PROTOTYPES])dnl -AC_CACHE_CHECK(whether setvbuf arguments are reversed, - ac_cv_func_setvbuf_reversed, - [ac_cv_func_setvbuf_reversed=no - AC_LINK_IFELSE( - [AC_LANG_PROGRAM( - [[#include -# if PROTOTYPES - int (setvbuf) (FILE *, int, char *, size_t); -# endif]], - [[char buf; return setvbuf (stdout, _IOLBF, &buf, 1);]])], - [AC_LINK_IFELSE( - [AC_LANG_PROGRAM( - [[#include -# if PROTOTYPES - int (setvbuf) (FILE *, int, char *, size_t); -# endif]], - [[char buf; return setvbuf (stdout, &buf, _IOLBF, 1);]])], - [# It compiles and links either way, so it must not be declared - # with a prototype and most likely this is a K&R C compiler. - # Try running it. - AC_RUN_IFELSE( - [AC_LANG_PROGRAM( - [[#include ]], - [[/* This call has the arguments reversed. - A reversed system may check and see that the address of buf - is not _IOLBF, _IONBF, or _IOFBF, and return nonzero. */ - char buf; - if (setvbuf (stdout, _IOLBF, &buf, 1) != 0) - exit (1); - putchar ('\r'); - exit (0); /* Non-reversed systems SEGV here. */]])], - ac_cv_func_setvbuf_reversed=yes, - rm -f core core.* *.core, - [[: # Assume setvbuf is not reversed when cross-compiling.]])] - ac_cv_func_setvbuf_reversed=yes)])]) -if test $ac_cv_func_setvbuf_reversed = yes; then - AC_DEFINE(SETVBUF_REVERSED, 1, - [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.]) -fi -])# make_FUNC_SETVBUF_REVERSED diff --git a/src/gmake/alloca.c b/src/gmake/alloca.c deleted file mode 100644 index 6e009b4e..00000000 --- a/src/gmake/alloca.c +++ /dev/null @@ -1,503 +0,0 @@ -/* alloca.c -- allocate automatically reclaimed memory - (Mostly) portable public-domain implementation -- D A Gwyn - - This implementation of the PWB library alloca function, - which is used to allocate space off the run-time stack so - that it is automatically reclaimed upon procedure exit, - was inspired by discussions with J. Q. Johnson of Cornell. - J.Otto Tennant 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/src/gmake/amiga.c b/src/gmake/amiga.c deleted file mode 100644 index b6d1e92b..00000000 --- a/src/gmake/amiga.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Running commands on Amiga -Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "make.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) - fatal (NILF, "MyExecute: Cannot allocate space for calling a command"); - - ptr = buffer; - - for (aptr=argv; *aptr; aptr++) - { - if (((*aptr)[0] == ';' && !(*aptr)[1])) - { - *ptr ++ = '"'; - strcpy (ptr, *aptr); - ptr += strlen (ptr); - *ptr ++ = '"'; - } - else if ((*aptr)[0] == '@' && (*aptr)[1] == '@' && !(*aptr)[2]) - { - *ptr ++ = '\n'; - continue; - } - else - { - strcpy (ptr, *aptr); - ptr += strlen (ptr); - } - *ptr ++ = ' '; - *ptr = 0; - } - - ptr[-1] = '\n'; - - status = SystemTags (buffer, - SYS_UserShell, TRUE, - TAG_END); - - FreeMem (buffer, len); - - if (SetSignal(0L,0L) & SIGBREAKF_CTRL_C) - status = 20; - - /* Warnings don't count */ - if (status == 5) - status = 0; - - return status; -} - -char * -wildcard_expansion (char *wc, char *o) -{ -# define PATH_SIZE 1024 - struct AnchorPath * apath; - - if ( (apath = AllocMem (sizeof (struct AnchorPath) + PATH_SIZE, - MEMF_CLEAR)) - ) - { - apath->ap_Strlen = PATH_SIZE; - - if (MatchFirst (wc, apath) == 0) - { - do - { - o = variable_buffer_output (o, apath->ap_Buf, - strlen (apath->ap_Buf)); - o = variable_buffer_output (o, " ",1); - } while (MatchNext (apath) == 0); - } - - MatchEnd (apath); - FreeMem (apath, sizeof (struct AnchorPath) + PATH_SIZE); - } - - return o; -} - diff --git a/src/gmake/amiga.h b/src/gmake/amiga.h deleted file mode 100644 index 99a1c598..00000000 --- a/src/gmake/amiga.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Definitions for amiga specific things -Copyright (C) 1995, 1996 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -extern int MyExecute PARAMS ((char ** argv)); -extern char * wildcard_expansion PARAMS ((char * wc, char * o)); - diff --git a/src/gmake/ar.c b/src/gmake/ar.c deleted file mode 100644 index 3b9d3a77..00000000 --- a/src/gmake/ar.c +++ /dev/null @@ -1,310 +0,0 @@ -/* Interface to `ar' archives for GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1997, -2002 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" - -#ifndef NO_ARCHIVES - -#include "filedef.h" -#include "dep.h" -#include - -/* Defined in arscan.c. */ -extern long int ar_scan PARAMS ((char *archive, long int (*function) (), long int arg)); -extern int ar_name_equal PARAMS ((char *name, char *mem, int truncated)); -#ifndef VMS -extern int ar_member_touch PARAMS ((char *arname, char *memname)); -#endif - -/* Return nonzero if NAME is an archive-member reference, zero if not. - An archive-member reference is a name like `lib(member)'. - If a name like `lib((entry))' is used, a fatal error is signaled at - the attempt to use this unsupported feature. */ - -int -ar_name (char *name) -{ - char *p = strchr (name, '('); - char *end; - - if (p == 0 || p == name) - return 0; - - end = p + strlen (p) - 1; - if (*end != ')') - return 0; - - if (p[1] == '(' && end[-1] == ')') - fatal (NILF, _("attempt to use unsupported feature: `%s'"), name); - - return 1; -} - - -/* Parse the archive-member reference NAME into the archive and member names. - Put the malloc'd archive name in *ARNAME_P if ARNAME_P is non-nil; - put the malloc'd member name in *MEMNAME_P if MEMNAME_P is non-nil. */ - -void -ar_parse_name (char *name, char **arname_p, char **memname_p) -{ - char *p = strchr (name, '('), *end = name + strlen (name) - 1; - - if (arname_p != 0) - *arname_p = savestring (name, p - name); - - if (memname_p != 0) - *memname_p = savestring (p + 1, end - (p + 1)); -} - -static long int ar_member_date_1 PARAMS ((int desc, char *mem, int truncated, long int hdrpos, - long int datapos, long int size, long int date, int uid, int gid, int mode, char *name)); - -/* Return the modtime of NAME. */ - -time_t -ar_member_date (char *name) -{ - char *arname; - int arname_used = 0; - 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 (arname); - arname_used = 1; - } - - if (arfile != 0) - (void) f_mtime (arfile, 0); - } - - val = ar_scan (arname, ar_member_date_1, (long int) memname); - - if (!arname_used) - free (arname); - free (memname); - - return (val <= 0 ? (time_t) -1 : (time_t) val); -} - -/* This function is called by `ar_scan' to find which member to look at. */ - -/* ARGSUSED */ -static long int -ar_member_date_1 (int desc, char *mem, int truncated, - long int hdrpos, long int datapos, long int size, - long int date, int uid, int gid, int mode, char *name) -{ - return ar_name_equal (name, mem, truncated) ? date : 0; -} - -/* Set the archive-member NAME's modtime to now. */ - -#ifdef VMS -int -ar_touch (char *name) -{ - error (NILF, _("touch archive member is not available on VMS")); - return -1; -} -#else -int -ar_touch (char *name) -{ - char *arname, *memname; - int arname_used = 0; - register 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 itself. */ - { - struct file *arfile; - arfile = lookup_file (arname); - if (arfile == 0) - { - arfile = enter_file (arname); - arname_used = 1; - } - - (void) f_mtime (arfile, 0); - } - - val = 1; - switch (ar_member_touch (arname, memname)) - { - case -1: - error (NILF, _("touch: Archive `%s' does not exist"), arname); - break; - case -2: - error (NILF, _("touch: `%s' is not a valid archive"), arname); - break; - case -3: - perror_with_name ("touch: ", arname); - break; - case 1: - error (NILF, - _("touch: Member `%s' does not exist in `%s'"), memname, arname); - break; - case 0: - val = 0; - break; - default: - error (NILF, - _("touch: Bad return code from ar_member_touch on `%s'"), name); - } - - if (!arname_used) - free (arname); - free (memname); - - return val; -} -#endif /* !VMS */ - -/* State of an `ar_glob' run, passed to `ar_glob_match'. */ - -struct ar_glob_state - { - char *arname; - char *pattern; - 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, char *mem, int truncated, - long int hdrpos, long int datapos, long int size, - long int date, int uid, int gid, int mode, - struct ar_glob_state *state) -{ - if (fnmatch (state->pattern, mem, FNM_PATHNAME|FNM_PERIOD) == 0) - { - /* We have a match. Add it to the chain. */ - struct nameseq *new = (struct nameseq *) xmalloc (state->size); - new->name = concat (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 open = 0; - - for (p = pattern; *p != '\0'; ++p) - switch (*p) - { - case '?': - case '*': - return 1; - - case '\\': - if (quote) - ++p; - break; - - case '[': - open = 1; - break; - - case ']': - if (open) - 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 (char *arname, char *member_pattern, unsigned int size) -{ - struct ar_glob_state state; - char **names; - struct nameseq *n; - unsigned int i; - - if (! glob_pattern_p (member_pattern, 1)) - return 0; - - /* Scan the archive for matches. - ar_glob_match will accumulate them in STATE.chain. */ - i = strlen (arname); - state.arname = (char *) alloca (i + 2); - bcopy (arname, state.arname, i); - state.arname[i] = '('; - state.arname[i + 1] = '\0'; - state.pattern = member_pattern; - state.size = size; - state.chain = 0; - state.n = 0; - (void) ar_scan (arname, ar_glob_match, (long int) &state); - - if (state.chain == 0) - return 0; - - /* Now put the names into a vector for sorting. */ - names = (char **) alloca (state.n * sizeof (char *)); - i = 0; - for (n = state.chain; n != 0; n = n->next) - names[i++] = n->name; - - /* Sort them alphabetically. */ - qsort ((char *) names, i, sizeof (*names), alpha_compare); - - /* Put them back into the chain in the sorted order. */ - i = 0; - for (n = state.chain; n != 0; n = n->next) - n->name = names[i++]; - - return state.chain; -} - -#endif /* Not NO_ARCHIVES. */ diff --git a/src/gmake/arscan.c b/src/gmake/arscan.c deleted file mode 100644 index b1e9971a..00000000 --- a/src/gmake/arscan.c +++ /dev/null @@ -1,840 +0,0 @@ -/* Library function for scanning an archive file. -Copyright (C) 1987,89,91,92,93,94,95,97 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, write to the Free Software -Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, -USA. */ - -#include "make.h" - -#ifdef HAVE_FCNTL_H -#include -#else -#include -#endif - -#ifndef NO_ARCHIVES - -#ifdef VMS -#include -#include -#include -#include -#include -#if __DECC -#include -#include -#endif - -static void *VMS_lib_idx; - -static char *VMS_saved_memname; - -static time_t VMS_member_date; - -static long int (*VMS_function) (); - -static int -VMS_get_member_info (struct dsc$descriptor_s *module, unsigned long *rfa) -{ - int status, i; - long int fnval; - - time_t val; - - static struct dsc$descriptor_s bufdesc = - { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL }; - - struct mhddef *mhd; - char filename[128]; - - bufdesc.dsc$a_pointer = filename; - bufdesc.dsc$w_length = sizeof (filename); - - status = lbr$set_module (&VMS_lib_idx, rfa, &bufdesc, - &bufdesc.dsc$w_length, 0); - if (! (status & 1)) - { - error (NILF, _("lbr$set_module failed to extract module info, status = %d"), - status); - - lbr$close (&VMS_lib_idx); - - return 0; - } - - mhd = (struct mhddef *) filename; - -#ifdef __DECC - /* John Fowler writes this is needed in his environment, - * but that decc$fix_time() isn't documented to work this way. Let me - * know if this causes problems in other VMS environments. - */ - val = decc$fix_time (&mhd->mhd$l_datim) + timezone - daylight*3600; -#endif - - for (i = 0; i < module->dsc$w_length; i++) - filename[i] = _tolower ((unsigned char)module->dsc$a_pointer[i]); - - filename[i] = '\0'; - - VMS_member_date = (time_t) -1; - - fnval = - (*VMS_function) (-1, filename, 0, 0, 0, 0, val, 0, 0, 0, - VMS_saved_memname); - - if (fnval) - { - VMS_member_date = fnval; - return 0; - } - else - return 1; -} - -/* 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 (char *archive, long int (*function) PARAMS ((void)), long int arg) -{ - char *p; - - static struct dsc$descriptor_s libdesc = - { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL }; - - unsigned long func = LBR$C_READ; - unsigned long type = LBR$C_TYP_UNK; - unsigned long index = 1; - - int status; - - status = lbr$ini_control (&VMS_lib_idx, &func, &type, 0); - - if (! (status & 1)) - { - error (NILF, _("lbr$ini_control failed with status = %d"),status); - return -2; - } - - libdesc.dsc$a_pointer = archive; - libdesc.dsc$w_length = strlen (archive); - - status = lbr$open (&VMS_lib_idx, &libdesc, 0, 0, 0, 0, 0); - - if (! (status & 1)) - { - error (NILF, _("unable to open library `%s' to lookup member `%s'"), - archive, (char *)arg); - return -1; - } - - VMS_saved_memname = (char *)arg; - - /* For comparison, delete .obj from arg name. */ - - p = strrchr (VMS_saved_memname, '.'); - if (p) - *p = '\0'; - - VMS_function = function; - - VMS_member_date = (time_t) -1; - lbr$get_index (&VMS_lib_idx, &index, VMS_get_member_info, 0); - - /* Undo the damage. */ - if (p) - *p = '.'; - - lbr$close (&VMS_lib_idx); - - return VMS_member_date > 0 ? VMS_member_date : 0; -} - -#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 -# ifndef __BEOS__ -# include -# else - /* BeOS 5 doesn't have but has 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 -#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 -#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 (char *archive, long int (*function)(), long int arg) -{ -#ifdef AIAMAG - FL_HDR fl_header; -#ifdef AIAMAGBIG - int big_archive = 0; - FL_HDR_BIG fl_header_big; -#endif -#else - int long_name = 0; -#endif - char *namemap = 0; - register 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 || bcmp (buf, ARMAG, SARMAG)) - { - (void) close (desc); - return -2; - } - } -#else -#ifdef AIAMAG - { - register int nread = read (desc, (char *) &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 (!bcmp (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, (char *) &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 (bcmp (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. */ -#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, (char *) &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, (char *) &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, (char *) &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 - bcmp (member_header.ar_fmag, ARFMAG, 2) -# else - 1 -# endif - && -# ifdef ARFZMAG - bcmp (member_header.ar_fmag, ARFZMAG, 2) -# else - 1 -# endif - ) -#endif - ) - { - (void) close (desc); - return -2; - } - - name = namebuf; - bcopy (member_header.ar_name, 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 = (char *) 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 (member_header.ar_mode, "%o", &eltmode); - eltsize = atol (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 (member_header.ar_date), - atoi (member_header.ar_uid), - atoi (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 = (char *) 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 (char *name, char *mem, int truncated) -{ - 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 */ - } -#endif /* !VMS */ - - return !strcmp (name, mem); -} - -#ifndef VMS -/* ARGSUSED */ -static long int -ar_member_pos (int desc, char *mem, int truncated, - long int hdrpos, long int datapos, long int size, - long int date, int uid, int gid, int mode, char *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 (char *arname, char *memname) -{ - register long int pos = ar_scan (arname, ar_member_pos, (long int) memname); - register int fd; - struct ar_hdr ar_hdr; - register int i; - 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, (char *) &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, (char *) &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 (i = 0; i < sizeof ar_hdr.ar_date; i++) - ar_hdr.ar_date[i] = ' '; - sprintf (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, (char *) &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, char *name, int truncated, - long int hdrpos, long int datapos, long int size, - long int date, int uid, int gid, int mode) -{ - 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); - return 0; -} - -#endif /* TEST. */ -#endif /* NO_ARCHIVES. */ diff --git a/src/gmake/build.template b/src/gmake/build.template deleted file mode 100644 index 894140e2..00000000 --- a/src/gmake/build.template +++ /dev/null @@ -1,83 +0,0 @@ -#!/bin/sh -# Shell script to build GNU Make in the absence of any `make' program. -# @configure_input@ - -# Copyright (C) 1993, 1994, 1997, 2003 Free Software Foundation, Inc. -# This file is part of GNU Make. -# -# GNU Make is free software; you can 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. -# -# GNU Make is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Make; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. - -# See Makefile.in for comments describing these variables. - -srcdir='@srcdir@' -CC='@CC@' -CFLAGS='@CFLAGS@' -CPPFLAGS='@CPPFLAGS@' -LDFLAGS='@LDFLAGS@' -ALLOCA='@ALLOCA@' -LOADLIBES='@LIBS@' -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="-DALIASPATH=\"${aliaspath}\" -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="%objs% remote-${REMOTE}.${OBJEXT} ${extras} ${ALLOCA}" - -if [ x"$GLOBLIB" != x ]; then - objs="$objs %globobjs%" - 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 $LDFLAGS $objs $LOADLIBES -o makenew${EXEEXT} -echo done -mv -f makenew${EXEEXT} make${EXEEXT} diff --git a/src/gmake/build_w32.bat b/src/gmake/build_w32.bat deleted file mode 100644 index b9fddee8..00000000 --- a/src/gmake/build_w32.bat +++ /dev/null @@ -1,142 +0,0 @@ -set make=gnumake -+if not exist config.h copy config.h.W32 config.h -cd w32\subproc -echo "Creating the subproc library" -%ComSpec% /c build.bat -cd ..\.. -del link.dbg link.rel -del config.h -copy config.h.W32 config.h -echo off -echo "Creating GNU make for Windows 95/NT" -echo on -if not exist .\WinDebug\nul mkdir .\WinDebug -cl.exe /nologo /MT /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 main.c -echo WinDebug\main.obj >>link.dbg -cl.exe /nologo /MT /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 -echo off -echo "Linking WinDebug/%make%.exe" -rem link.exe 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 /MACHINE:I386 /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/read.obj .\WinDebug/version.obj .\WinDebug/getopt.obj .\WinDebug/arscan.obj .\WinDebug/remake.obj .\WinDebug/hash.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 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 /MACHINE:I386 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 main.c -echo WinRel\main.obj >>link.rel -cl.exe /nologo /MT /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 /W3 /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 -echo off -echo "Linking WinRel/%make%.exe" -rem link.exe 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 /MACHINE:I386 /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/read.obj .\WinRel/version.obj .\WinRel/getopt.obj .\WinRel/arscan.obj .\WinRel/remake.obj .\WinRel/misc.obj .\WinRel/hash.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 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 /MACHINE:I386 /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!" -echo on diff --git a/src/gmake/commands.c b/src/gmake/commands.c deleted file mode 100644 index a6964d55..00000000 --- a/src/gmake/commands.c +++ /dev/null @@ -1,587 +0,0 @@ -/* Command processing for GNU Make. -Copyright (C) 1988,89,91,92,93,94,95,96,97 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" -#include "dep.h" -#include "filedef.h" -#include "variable.h" -#include "job.h" -#include "commands.h" - -#if VMS -# define FILE_LIST_SEPARATOR ',' -#else -# define FILE_LIST_SEPARATOR ' ' -#endif - -extern int remote_kill PARAMS ((int id, int sig)); - -#ifndef HAVE_UNISTD_H -extern int getpid (); -#endif - -/* Set FILE's automatic variables up. */ - -static void -set_file_variables (struct file *file) -{ - 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; - char *p; - - p = strchr (file->name, '('); - at = (char *) alloca (p - file->name + 1); - bcopy (file->name, at, p - file->name); - at[p - file->name] = '\0'; - len = strlen (p + 1); - percent = (char *) alloca (len); - bcopy (p + 1, percent, len - 1); - percent[len - 1] = '\0'; - } - 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. */ - register struct dep *d; - 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 (".SUFFIXES")->deps; d != 0; d = d->next) - { - unsigned int slen = strlen (dep_name (d)); - if (len > slen && strneq (dep_name (d), name + (len - slen), slen)) - { - file->stem = savestring (name, len - slen); - break; - } - } - if (d == 0) - file->stem = ""; - } - star = file->stem; - - /* $< is the first dependency. */ - less = file->deps != 0 ? dep_name (file->deps) : ""; - - 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 int qmark_max=0, plus_max=0, bar_max=0; - - unsigned int qmark_len, plus_len, bar_len; - char *cp; - char *caret_value; - char *qp; - char *bp; - struct dep *d; - unsigned int len; - - /* Compute first the value for $+, which is supposed to contain - duplicate dependencies as they were listed in the makefile. */ - - plus_len = 0; - for (d = file->deps; d != 0; d = d->next) - if (! d->ignore_mtime) - plus_len += strlen (dep_name (d)) + 1; - if (plus_len == 0) - plus_len++; - - if (plus_len > plus_max) - plus_value = (char *) xmalloc (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) - { - 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); - - bcopy (c, cp, len); - cp += len; - *cp++ = FILE_LIST_SEPARATOR; - if (! d->changed) - 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); - - /* Make sure that no dependencies are repeated. This does not - really matter for the purpose of updating targets, but it - might make some names be listed twice for $^ and $?. */ - - uniquize_deps (file->deps); - - bar_len = 0; - for (d = file->deps; d != 0; d = d->next) - if (d->ignore_mtime) - bar_len += strlen (dep_name (d)) + 1; - if (bar_len == 0) - bar_len++; - - /* Compute the values for $^, $?, and $|. */ - - cp = caret_value = plus_value; /* Reuse the buffer; it's big enough. */ - - if (qmark_len > qmark_max) - qmark_value = (char *) xmalloc (qmark_max = qmark_len); - qp = qmark_value; - - if (bar_len > bar_max) - bar_value = (char *) xmalloc (bar_max = bar_len); - bp = bar_value; - - for (d = file->deps; d != 0; d = d->next) - { - 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); - - if (d->ignore_mtime) - { - bcopy (c, bp, len); - bp += len; - *bp++ = FILE_LIST_SEPARATOR; - } - else - { - bcopy (c, cp, len); - cp += len; - *cp++ = FILE_LIST_SEPARATOR; - if (d->changed) - { - bcopy (c, qp, len); - qp += len; - *qp++ = FILE_LIST_SEPARATOR; - } - } - } - - /* 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) -{ - register char *p; - 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. - Also set the corresponding CMDS->lines_flags elements, - and the CMDS->any_recurse flag. */ - - nlines = 5; - lines = (char **) xmalloc (5 * sizeof (char *)); - idx = 0; - p = cmds->commands; - while (*p != '\0') - { - 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; - register char *b; - for (b = end - 2; b >= p && *b == '\\'; --b) - backslash = !backslash; - if (backslash) - { - ++end; - goto find_end; - } - } - - if (idx == nlines) - { - nlines += 2; - lines = (char **) xrealloc ((char *) lines, - nlines * sizeof (char *)); - } - lines[idx++] = savestring (p, end - p); - p = end; - if (*p != '\0') - ++p; - } - - if (idx != nlines) - { - nlines = idx; - lines = (char **) xrealloc ((char *) lines, - nlines * sizeof (char *)); - } - - cmds->ncommand_lines = nlines; - cmds->command_lines = lines; - - cmds->any_recurse = 0; - cmds->lines_flags = (char *) xmalloc (nlines); - for (idx = 0; idx < nlines; ++idx) - { - int flags = 0; - - for (p = lines[idx]; - isblank ((unsigned char)*p) || *p == '-' || *p == '@' || *p == '+'; - ++p) - switch (*p) - { - case '+': - flags |= COMMANDS_RECURSE; - break; - case '@': - flags |= COMMANDS_SILENT; - break; - case '-': - flags |= COMMANDS_NOERROR; - break; - } - if (!(flags & COMMANDS_RECURSE)) - { - unsigned int len = strlen (p); - if (sindex (p, len, "$(MAKE)", 7) != 0 - || sindex (p, len, "${MAKE}", 7) != 0) - flags |= COMMANDS_RECURSE; - } - - cmds->lines_flags[idx] = flags; - cmds->any_recurse |= flags & COMMANDS_RECURSE; - } -} - -/* 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) -{ - register 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 = 0; - notice_finished_file (file); - return; - } - - /* First set the automatic variables according to this file. */ - - initialize_file_variables (file, 0); - - set_file_variables (file); - - /* 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 */ - 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) - { - register 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 - ) - { - register 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 (EXIT_FAILURE); -#endif - - /* 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 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, 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) - error (NILF, _("*** [%s] Archive member `%s' may be bogus; not deleted"), - on_behalf_of, file->name); - else - 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) - error (NILF, _("*** [%s] Deleting file `%s'"), on_behalf_of, file->name); - else - 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, (char *) 0); - - /* 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 (struct commands *cmds) -{ - register char *s; - - fputs (_("# commands 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') - { - char *end; - - while (isspace ((unsigned char)*s)) - ++s; - - end = strchr (s, '\n'); - if (end == 0) - end = s + strlen (s); - - printf ("\t%.*s\n", (int) (end - s), s); - - s = end; - } -} diff --git a/src/gmake/commands.h b/src/gmake/commands.h deleted file mode 100644 index edec9103..00000000 --- a/src/gmake/commands.h +++ /dev/null @@ -1,42 +0,0 @@ -/* Definition of data structures describing shell commands for GNU Make. -Copyright (C) 1988, 1989, 1991, 1993 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* Structure that gives the commands to make a file - and information about where these commands came from. */ - -struct commands - { - struct floc fileinfo; /* Where commands were defined. */ - char *commands; /* Commands text. */ - unsigned int ncommand_lines;/* Number of command lines. */ - char **command_lines; /* Commands chopped up into lines. */ - char *lines_flags; /* One set of flag bits for each line. */ - int any_recurse; /* Nonzero if any `lines_recurse' 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: -. */ - -extern void execute_file_commands PARAMS ((struct file *file)); -extern void print_commands PARAMS ((struct commands *cmds)); -extern void delete_child_targets PARAMS ((struct child *child)); -extern void chop_commands PARAMS ((struct commands *cmds)); diff --git a/src/gmake/config.ami.template b/src/gmake/config.ami.template deleted file mode 100644 index c0548b24..00000000 --- a/src/gmake/config.ami.template +++ /dev/null @@ -1,317 +0,0 @@ -/* config.h.in. Generated automatically from configure.in by autoheader. */ - -/* 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 you don't have vprintf but do have _doprnt. */ -/* #undef HAVE_DOPRNT */ - -/* 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 */ - -/* 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 . */ -/* #undef HAVE_VFORK_H */ - -/* Define if you have the vprintf function. */ -#define HAVE_VPRINTF 1 - -/* 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 */ - -/* Define vfork as fork if vfork does not work. */ -/* #undef vfork */ - -/* Name of this package (needed by automake) */ -#define PACKAGE "%PACKAGE%" - -/* Version of this package (needed by automake) */ -#define VERSION "%VERSION%" - -/* 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 if you have the strcasecmp function. */ -/* #undef HAVE_STRCASECMP */ - -/* 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 if you have the sun library (-lsun). */ -/* #undef HAVE_LIBSUN */ - -/* Define for Case Insensitve behavior */ -#define HAVE_CASE_INSENSITIVE_FS - -/* Build host information. */ -#define MAKE_HOST "Amiga" diff --git a/src/gmake/config.h-vms.template b/src/gmake/config.h-vms.template deleted file mode 100644 index 7d7d9b0c..00000000 --- a/src/gmake/config.h-vms.template +++ /dev/null @@ -1,403 +0,0 @@ -/* config.h-vms. Generated by hand by Klaus Kämpf */ -/* config.h. Generated automatically by configure. */ -/* config.h.in. Generated automatically from configure.in by autoheader. */ - -/* 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 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 */ - -/* Define 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 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. */ -/* #undef gid_t */ - -/* Define if you have alloca, as a function or macro. */ -#define HAVE_ALLOCA 1 - -/* Define if you have and it should be used (not on Ultrix). */ -/* #undef HAVE_ALLOCA_H */ - -/* Define if you don't have vprintf but do have _doprnt. */ -/* #undef HAVE_DOPRNT */ - -/* 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 */ - -/* 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. */ -/* #undef HAVE_STRCOLL */ - -/* Define if your struct stat has st_rdev. */ -/* #undef HAVE_ST_RDEV */ - -/* Define if you have the strftime function. */ -/* #undef HAVE_STRFTIME */ - -/* 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. */ -/* #undef HAVE_TZNAME */ - -/* Define if you have . */ -#ifdef __DECC -#define HAVE_UNISTD_H 1 -#endif - -/* Define if utime(file, NULL) sets file's timestamp to the present. */ -/* #undef HAVE_UTIME_NULL */ - -/* Define if you have . */ -/* #undef HAVE_VFORK_H */ - -/* Define if you have the vprintf function. */ -#define HAVE_VPRINTF 1 - -/* 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. */ -/* I assume types.h is available for all 5.0 cc/cxx compilers */ -#if __DECC_VER < 50090000 -#define pid_t int -#endif - -/* 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 - */ -/* #undef STACK_DIRECTION */ - -/* Define if the `S_IS*' macros in do not work properly. */ -/* #undef STAT_MACROS_BROKEN */ - -/* Define if you have the ANSI C header files. */ -/* #undef 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. */ -#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 */ - -/* Define vfork as fork if vfork does not work. */ -/* #undef vfork */ - -/* Name of this package (needed by automake) */ -#define PACKAGE "%PACKAGE%" - -/* Version of this package (needed by automake) */ -#define VERSION "%VERSION%" - -/* 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 this if the C library defines the variable `sys_siglist'. */ -/* #undefine 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. */ -#define HAVE_DUP2 1 - -/* 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 getloadavg function. */ -/* #undef HAVE_GETLOADAVG */ - -/* 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. */ -/* #undefine HAVE_SETREGID */ - -/* Define if you have the setreuid function. */ -/* #define HAVE_SETREUID */ - -/* Define if you have the sigsetmask function. */ -#define HAVE_SIGSETMASK 1 - -/* Define if you have the socket function. */ -/* #undef HAVE_SOCKET */ - -/* Define if you have the strcasecmp function. */ -/* #undef HAVE_STRCASECMP */ - -/* 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. */ -#ifdef __DECC -#define HAVE_FCNTL_H 1 -#endif - -/* 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. */ -#define HAVE_STDLIB_H 1 - -/* Define if you have the header file. */ -#define HAVE_STRING_H 1 - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_DIR_H */ - -/* 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. */ -#ifndef __GNUC__ -#define HAVE_SYS_TIMEB_H 1 -#endif - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_WAIT_H */ - -/* Define if you have the dgc library (-ldgc). */ -/* #undef HAVE_LIBDGC */ - -/* Define if you have the kstat library (-lkstat). */ -/* #undef HAVE_LIBKSTAT * - -/* Define if you have the sun library (-lsun). */ -/* #undef HAVE_LIBSUN */ - -/* 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 sensitve 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 the first one is defined */ -#ifdef __CRTL_VER -# if __CRTL_VER < 70000000 -# define HAVE_VMSDIR_H 1 -# endif -#else -# if __VMS_VER < 70000000 -# define HAVE_VMSDIR_H 1 -# endif -#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 -#endif - -#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) -#undef PARAMS -#define PARAMS(protos) protos -#else /* Not C++ or ANSI C. */ -#undef PARAMS -#define PARAMS(protos) () -#endif /* C++ or ANSI C. */ - -/* Define if using alloca.c. */ -/* #undef C_ALLOCA */ -/* maybe this should be placed into make.h */ -#if defined(__VAX) && defined(__DECC) -#define alloca(n) __ALLOCA(n) -#endif - -/* Build host information. */ -#define MAKE_HOST "VMS" diff --git a/src/gmake/config.h.W32.template b/src/gmake/config.h.W32.template deleted file mode 100644 index 4e484679..00000000 --- a/src/gmake/config.h.W32.template +++ /dev/null @@ -1,399 +0,0 @@ -/* config.h.in. Generated automatically from configure.in by autoheader. */ - -/* 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. */ -/* #undef 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. */ -#undef gid_t -#define gid_t int - -/* Define if you have alloca, as a function or macro. */ -#undef HAVE_ALLOCA -#define HAVE_ALLOCA 1 - -/* Define if you have and it should be used (not on Ultrix). */ -/* #undef HAVE_ALLOCA_H */ - -/* Define if you don't have vprintf but do have _doprnt. */ -/* #undef HAVE_DOPRNT */ - -/* 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 */ - -/* Define if the `long double' type works. */ -/* #undef HAVE_LONG_DOUBLE */ - -/* Define if you support file names longer than 14 characters. */ -#undef HAVE_LONG_FILE_NAMES -#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. */ -#undef HAVE_STRCOLL -#define HAVE_STRCOLL 1 - -/* Define if your struct stat has st_rdev. */ -#undef HAVE_ST_RDEV -#define HAVE_ST_RDEV 1 - -/* Define if you have the strftime function. */ -#undef HAVE_STRFTIME -#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. */ -#undef HAVE_TZNAME -#define HAVE_TZNAME 1 - -/* Define if you have . */ -/* #undef HAVE_UNISTD_H */ - -/* Define if utime(file, NULL) sets file's timestamp to the present. */ -#undef HAVE_UTIME_NULL -#define HAVE_UTIME_NULL 1 - -/* Define if you have . */ -/* #undef HAVE_VFORK_H */ - -/* Define if you have the vprintf function. */ -#undef HAVE_VPRINTF -#define HAVE_VPRINTF 1 - -/* 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. */ -#undef pid_t -#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 _POSIX_SOURCE 1 - -/* Define as the return type of signal handlers (int or void). */ -#undef RETSIGTYPE -#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 - */ -/* #undef STACK_DIRECTION */ - -/* Define if the `S_IS*' macros in do not work properly. */ -/* #undef STAT_MACROS_BROKEN */ - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS -#define STDC_HEADERS 1 - -/* 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. */ -#undef uid_t -#define uid_t int - -/* Define for Encore UMAX. */ -/* #undef UMAX */ - -/* Define for Encore UMAX 4.3 that has - instead of . */ -/* #undef UMAX4_3 */ - -/* Define vfork as fork if vfork does not work. */ -/* #undef vfork */ - -/* Name of this package (needed by automake) */ -#define PACKAGE "%PACKAGE%" - -/* Version of this package (needed by automake) */ -#define VERSION "%VERSION%" - -/* Define to the name of the SCCS `get' command. */ -#undef SCCS_GET -#define SCCS_GET "echo no sccs get" - -/* 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 */ - -/* Define if your locale.h file contains LC_MESSAGES. */ -/* #undef HAVE_LC_MESSAGES */ - -/* Define to the installation directory for locales. */ -#define LOCALEDIR "" - -/* 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 HAVE_DUP2 1 - -/* Define if you have the getcwd function. */ -#undef HAVE_GETCWD -#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 getloadavg function. */ -/* #undef HAVE_GETLOADAVG */ - -/* Define if you have the memmove function. */ -#undef HAVE_MEMMOVE -#define HAVE_MEMMOVE 1 - -/* Define if you have the mktemp function. */ -#undef HAVE_MKTEMP -#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 if you have the strcasecmp function. */ -/* #undef HAVE_STRCASECMP */ - -/* Define if you have the strerror function. */ -#undef HAVE_STRERROR -#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. */ -#undef HAVE_DIRENT_H -#define HAVE_DIRENT_H 1 - -/* Define if you have the header file. */ -#undef HAVE_FCNTL_H -#define HAVE_FCNTL_H 1 - -/* Define if you have the header file. */ -#undef HAVE_LIMITS_H -#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 HAVE_MEMORY_H 1 - -/* Define if you have the header file. */ -/* #undef HAVE_NDIR_H */ - -/* Define if you have the header file. */ -#undef HAVE_STRING_H -#define HAVE_STRING_H 1 - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_DIR_H */ - -/* 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 HAVE_SYS_TIMEB_H 1 - -/* Define if you have the header file. */ -/* #undef HAVE_SYS_WAIT_H */ - -/* Define if you have the header file. */ -/* #undef HAVE_UNISTD_H */ - -/* Define if you have the dgc library (-ldgc). */ -/* #undef HAVE_LIBDGC */ - -/* Define if you have the kstat library (-lkstat). */ -/* #undef HAVE_LIBKSTAT */ - -/* Define if you have the sun library (-lsun). */ -/* #undef HAVE_LIBSUN */ - -/* Use high resolution file timestamps if nonzero. */ -#define FILE_TIMESTAMP_HI_RES 0 - -/* Build host information. */ -#define MAKE_HOST "Windows32" - -/* Grok DOS paths (drive specs and backslash path element separators) */ -#define HAVE_DOS_PATHS - -/* - * 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. - */ -#undef BATCH_MODE_ONLY_SHELL -#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 - */ -#undef HAVE_CYGWIN_SHELL - -/* - * Define if you have the MKS tool set or shell. Do NOT define - * BATCH_MODE_ONLY_SHELL if you define HAVE_MKS_SHELL - */ -#undef HAVE_MKS_SHELL - -/* - * 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 - -/* Define if you prefer Case Insensitive behavior */ -#undef HAVE_CASE_INSENSITIVE_FS diff --git a/src/gmake/config/.cvsignore b/src/gmake/config/.cvsignore deleted file mode 100644 index 3fa7c2f2..00000000 --- a/src/gmake/config/.cvsignore +++ /dev/null @@ -1,4 +0,0 @@ -*.m4 -config.* - -Makefile Makefile.in diff --git a/src/gmake/config/ChangeLog b/src/gmake/config/ChangeLog deleted file mode 100644 index 31921775..00000000 --- a/src/gmake/config/ChangeLog +++ /dev/null @@ -1,19 +0,0 @@ -2003-04-30 Paul D. Smith - - * dospaths.m4: New macro to test for DOS-style pathnames, based on - coreutils 5.0 "dos.m4" by Jim Meyering. - -2002-04-21 gettextize - - * codeset.m4: New file, from gettext-0.11.1. - * gettext.m4: New file, from gettext-0.11.1. - * glibc21.m4: New file, from gettext-0.11.1. - * iconv.m4: New file, from gettext-0.11.1. - * isc-posix.m4: New file, from gettext-0.11.1. - * lcmessage.m4: New file, from gettext-0.11.1. - * lib-ld.m4: New file, from gettext-0.11.1. - * lib-link.m4: New file, from gettext-0.11.1. - * lib-prefix.m4: New file, from gettext-0.11.1. - * progtest.m4: New file, from gettext-0.11.1. - * Makefile.am: New file. - diff --git a/src/gmake/config/Makefile.am b/src/gmake/config/Makefile.am deleted file mode 100644 index 8295408b..00000000 --- a/src/gmake/config/Makefile.am +++ /dev/null @@ -1,7 +0,0 @@ -# -*-Makefile-*-, or close enough - -EXTRA_DIST = codeset.m4 gettext.m4 glibc21.m4 iconv.m4 isc-posix.m4 nls.m4 \ - intdiv0.m4 inttypes-pri.m4 inttypes.m4 inttypes_h.m4 \ - isc-posix.m4 lcmessage.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 \ - progtest.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4 \ - dospaths.m4 po.m4 diff --git a/src/gmake/configh.dos.template b/src/gmake/configh.dos.template deleted file mode 100644 index 40ef7705..00000000 --- a/src/gmake/configh.dos.template +++ /dev/null @@ -1,94 +0,0 @@ - -/* Many things are defined already by a system header. */ -#include - -#if __DJGPP__ > 2 || __DJGPP_MINOR__ > 1 - -/* Define if `sys_siglist' is declared by . */ -# define SYS_SIGLIST_DECLARED 1 - -/* Define this if the C library defines the variable `_sys_siglist'. */ -# define HAVE_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 if you have the fdopen function. */ -#define HAVE_FDOPEN 1 - -/* Define to 1 if you have the `getgroups' function. */ -#define HAVE_GETGROUPS 1 - -/* Define if you have the header file. */ -#define HAVE_MEMORY_H 1 - -/* Define 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 if you have the select function. */ -#define HAVE_SELECT 1 - -/* Define if you have the vprintf library function. */ -#undef HAVE_VPRINTF -#define HAVE_VPRINTF 1 - -/* Name of the package */ -#define PACKAGE "%PACKAGE%" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "bug-%PACKAGE%@gnu.org" - -/* Define to the full name of this package. */ -#define PACKAGE_NAME "GNU %PACKAGE%" - -/* Define to the full name and version of this package. */ -#define PACKAGE_STRING "GNU %PACKAGE% %VERSION%" - -/* Define to the one symbol short name of this package. */ -#define PACKAGE_TARNAME "%PACKAGE%" - -/* Define to the version of this package. */ -#define PACKAGE_VERSION "%VERSION%" - -/* Define to 1 if the C compiler supports function prototypes. */ -#define PROTOTYPES 1 - -/* Define to 1 if `sys_siglist' is declared by or . */ -#define SYS_SIGLIST_DECLARED 1 - -/* Version number of package */ -#define VERSION "%VERSION%" - -/* 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/src/gmake/configure.bat b/src/gmake/configure.bat deleted file mode 100644 index 55ba2624..00000000 --- a/src/gmake/configure.bat +++ /dev/null @@ -1,44 +0,0 @@ -@echo off -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/src/gmake/configure.in b/src/gmake/configure.in deleted file mode 100644 index 7e4117f2..00000000 --- a/src/gmake/configure.in +++ /dev/null @@ -1,394 +0,0 @@ -# Process this file with autoconf to produce a configure script. - -AC_INIT([GNU make],[3.81rc1],[bug-make@gnu.org]) - -AC_PREREQ(2.57) - -AC_REVISION([[$Id: configure.in,v 1.120 2003/07/31 13:04:32 psmith Exp $]]) - -# Autoconf setup -AC_CONFIG_AUX_DIR(config) -AC_CONFIG_SRCDIR(vpath.c) -AC_CONFIG_HEADERS(config.h) - -# Automake setup -AM_INIT_AUTOMAKE([1.7.6]) - -# Checks for programs. -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) - -# Specialized system macros -AC_CANONICAL_HOST -AC_AIX -AC_ISC_POSIX -AC_MINIX - -# Needed for ansi2knr -AM_C_PROTOTYPES - -# Enable gettext, in "external" mode. - -AM_GNU_GETTEXT_VERSION(0.12.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/time.h sys/timeb.h) - -AM_PROG_CC_C_O -AM_PROG_CC_STDC -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_MSG_CHECKING([whether to use high resolution file timestamps]) -AC_CACHE_VAL(make_cv_file_timestamp_hi_res, [ - make_cv_file_timestamp_hi_res=no - if test "$ac_cv_struct_st_mtim_nsec" != no; then - 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], - []) - fi]) -AC_MSG_RESULT($make_cv_file_timestamp_hi_res) -if test "$make_cv_file_timestamp_hi_res" = yes; then - val=1 -else - val=0 -fi -AC_DEFINE_UNQUOTED(FILE_TIMESTAMP_HI_RES, $val, - [Use high resolution file timestamps if nonzero.]) - -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. - AC_SEARCH_LIBS(clock_gettime, [rt posix4]) - if test "$ac_cv_search_clock_gettime" != no; then - AC_DEFINE(HAVE_CLOCK_GETTIME, 1, - [Define if you have the clock_gettime function.]) - fi -fi - -# 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)"])]) -if test "$ac_cv_func_gettimeofday" = yes; then - AC_DEFINE(HAVE_GETTIMEOFDAY, 1, - [Define if you have a standard gettimeofday function]) -fi - -AC_CHECK_FUNCS( memcpy memmove strchr strdup mkstemp mktemp fdopen \ - bsd_signal dup2 getcwd sigsetmask sigaction getgroups \ - seteuid setegid setlinebuf setreuid setregid setvbuf pipe \ - strerror strsignal) - -make_FUNC_SETVBUF_REVERSED - -# strcoll() is used by the GNU glob library -AC_FUNC_STRCOLL - -AC_FUNC_ALLOCA -AC_FUNC_FORK([]) -AC_FUNC_VPRINTF -AC_FUNC_CLOSEDIR_VOID - -AC_FUNC_GETLOADAVG - -# 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 - 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]) - if test "$make_cv_nlist_struct" = yes; then - AC_DEFINE(NLIST_STRUCT, 1, - [Define if struct nlist.n_name is a pointer rather than an array.]) - fi -fi - -AC_CHECK_DECLS([sys_siglist]) - - -# Check out the wait reality. -AC_CHECK_HEADERS(sys/wait.h) -AC_CHECK_FUNCS(waitpid wait3) -AC_MSG_CHECKING(for union wait) -AC_CACHE_VAL(make_cv_union_wait, [dnl - 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])]) -if test "$make_cv_union_wait" = yes; then - AC_DEFINE(HAVE_UNION_WAIT, 1, - [Define this if you have the \`union wait' type in .]) -fi -AC_MSG_RESULT($make_cv_union_wait) - - -# If we're building on Windows/DOS/OS/2, add some support for DOS drive specs. -if test "$PATH_SEPARATOR" = ';'; then - AC_DEFINE(HAVE_DOS_PATHS, 1, - [Define this if your system requires backslashes or drive specs in pathnames.]) -fi - - -# 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]), - [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_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]) - ;; - esac]) -# Tell automake about this, so it can include the right .c files. -AM_CONDITIONAL(USE_CUSTOMS, test "$use_customs" = true) - -# 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"]) - -has_wait_nohang=yes -case "$ac_cv_func_waitpid/$ac_cv_func_wait3" in - no/no) has_wait_nohang=no ;; -esac - -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])]) -if test "$make_cv_sa_restart" != no; then - AC_DEFINE(HAVE_SA_RESTART, 1, - [Define if defines the SA_RESTART constant.]) -fi - -case "$ac_cv_func_pipe/$ac_cv_func_sigaction/$make_cv_sa_restart/$has_wait_nohang/$make_cv_job_server" in - yes/yes/yes/yes/yes) - AC_DEFINE(MAKE_JOBSERVER, 1, - [Define this to enable job server support in GNU make.]);; -esac - -# 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, [ -if test -f /usr/sccs/get; then - make_cv_path_sccs_get=/usr/sccs/get -else - make_cv_path_sccs_get=get -fi]) -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. -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. - AC_CACHE_CHECK(if SCCS get command understands -G, make_cv_sys_get_minus_G, [ - 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]) - case "$make_cv_sys_get_minus_G" in - yes) AC_DEFINE(SCCS_GET_MINUS_G, 1, - [Define this if the SCCS 'get' command understands the '-G' option.]);; - esac -fi -rm -f s.conftest conftoast - -# Check the system to see if it provides GNU glob. If not, use our -# local version. - -AC_MSG_CHECKING(if system libc has GNU glob) -AC_CACHE_VAL(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 - ], [AC_MSG_RESULT(yes) -make_cv_sys_gnu_glob=yes], [AC_MSG_RESULT([no; using local copy]) -AC_SUBST(GLOBINC) GLOBINC='-I$(srcdir)/glob' -AC_SUBST(GLOBLIB) GLOBLIB=glob/libglob.a -make_cv_sys_gnu_glob=no])]) -# 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) - -# 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 -AC_SUBST_FILE(MAINT_MAKEFILE) - -# Allow building with dmalloc -AM_WITH_DMALLOC - - -# Sanity check and inform the user of what we found - -case "$make_badcust" in - yes) echo - echo "WARNING: --with-customs specified but no customs.h could be found;" - echo " disabling Customs support." - echo ;; -esac - -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 - -case "$has_wait_nohang" in - no) 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 ;; -esac - -case "$make_cv_job_server/$user_job_server" in - no/yes) 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 ;; -esac - - -# Specify what files are to be created. -# We only generate the build.sh if we have a build.sh.in; we won't have -# one before we've created a distribution. - -AC_CONFIG_FILES(Makefile glob/Makefile po/Makefile.in config/Makefile doc/Makefile) - -if test -f $srcdir/build.sh.in; then - AC_CONFIG_FILES(build.sh) -fi - - -# OK, do it! - -AC_OUTPUT - - -dnl Local Variables: -dnl comment-start: "dnl " -dnl comment-end: "" -dnl comment-start-skip: "\\bdnl\\b\\s *" -dnl compile-command: "make configure config.h.in" -dnl End: diff --git a/src/gmake/debug.h b/src/gmake/debug.h deleted file mode 100644 index 30c2d627..00000000 --- a/src/gmake/debug.h +++ /dev/null @@ -1,41 +0,0 @@ -/* Debugging macros and interface. -Copyright (C) 1999 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -#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/src/gmake/default.c b/src/gmake/default.c deleted file mode 100644 index b07f1527..00000000 --- a/src/gmake/default.c +++ /dev/null @@ -1,591 +0,0 @@ -/* Data base of default implicit rules for GNU Make. -Copyright (C) 1988,89,90,91,92,93,94,95,96 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" -#include "filedef.h" -#include "variable.h" -#include "rule.h" -#include "dep.h" -#include "job.h" -#include "commands.h" - -/* Define GCC_IS_NATIVE if gcc is the native development environment on - your system (gcc/bison/flex vs cc/yacc/lex). */ -#if defined(__MSDOS__) || defined(__EMX__) -# define GCC_IS_NATIVE -#endif - - -/* This is the default list of suffixes for suffix rules. - `.s' must come last, so that a `.o' file will be made from - a `.c' or `.p' or ... file rather than from a .s file. */ - -static char default_suffixes[] -#ifdef VMS - = ".exe .olb .ln .obj .c .cxx .cc .pas .p .for .f .r .y .l .mar \ -.s .ss .i .ii .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo \ -.w .ch .cweb .web .com .sh .elc .el"; -#elif defined(__EMX__) - = ".out .a .ln .o .c .cc .C .cpp .p .f .F .r .y .l .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 .r .y .l .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[] = - { - { "(%)", "%", - "$(AR) $(ARFLAGS) $@ $<" }, - - /* 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", "%", - "copy $< $@" }, -#else - { "%.out", "%", - "@rm -f $@ \n cp $< $@" }, -#endif - /* 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 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=$@ $<", - ".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=$@ $<", - ".cxx.obj", - "$(COMPILE.cxx) /obj=$@ $<", - ".for.obj", - "$(COMPILE.for) /obj=$@ $<", - ".pas.obj", - "$(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 $@", - ".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) $<", - ".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) $< > $@", - - ".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 char *default_variables[] = - { -#ifdef VMS -#ifdef __ALPHA - "ARCH", "ALPHA", -#else - "ARCH", "VAX", -#endif - "AR", "library/obj", - "ARFLAGS", "/replace", - "AS", "macro", - "MACRO", "macro", -#ifdef GCC_IS_NATIVE - "CC", "gcc", -#else - "CC", "cc", -#endif - "CD", "builtin_cd", - "MAKE", "make", - "ECHO", "write sys$$output \"", -#ifdef GCC_IS_NATIVE - "C++", "gcc/plus", - "CXX", "gcc/plus", -#else - "C++", "cxx", - "CXX", "cxx", - "CXXLD", "cxxlink", -#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", - -#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__ */ -#else - "CC", "cc", - "CXX", "g++", -#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.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", - "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 - -#ifdef _AMIGA - ".LIBPATTERNS", "%.lib", -#else -#ifdef __MSDOS__ - ".LIBPATTERNS", "lib%.a $(DJDIR)/lib/lib%.a", -#else - ".LIBPATTERNS", "lib%.so lib%.a", -#endif -#endif - -#endif /* !VMS */ - 0, 0 - }; - -/* Set up the default .SUFFIXES list. */ - -void -set_default_suffixes (void) -{ - suffix_file = enter_file (".SUFFIXES"); - - if (no_builtin_rules_flag) - (void) define_variable ("SUFFIXES", 8, "", o_default, 0); - else - { - char *p = default_suffixes; - suffix_file->deps = (struct dep *) - multi_glob (parse_file_seq (&p, '\0', sizeof (struct dep), 1), - sizeof (struct dep)); - (void) define_variable ("SUFFIXES", 8, 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 thee pattern rules - installed after. */ - -void -install_default_suffix_rules (void) -{ - register char **s; - - if (no_builtin_rules_flag) - return; - - for (s = default_suffix_rules; *s != 0; s += 2) - { - register struct file *f = enter_file (s[0]); - /* Don't clobber cmds given in a makefile if there were any. */ - if (f->cmds == 0) - { - f->cmds = (struct commands *) xmalloc (sizeof (struct commands)); - f->cmds->fileinfo.filenm = 0; - f->cmds->commands = s[1]; - f->cmds->command_lines = 0; - } - } -} - - -/* Install the default pattern rules. */ - -void -install_default_implicit_rules (void) -{ - register 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) -{ - register char **s; - - if (no_builtin_variables_flag) - return; - - for (s = default_variables; *s != 0; s += 2) - (void) define_variable (s[0], strlen (s[0]), s[1], o_default, 1); -} diff --git a/src/gmake/dep.h b/src/gmake/dep.h deleted file mode 100644 index 7f4380b7..00000000 --- a/src/gmake/dep.h +++ /dev/null @@ -1,78 +0,0 @@ -/* Definitions of dependency data structures for GNU Make. -Copyright (C) 1988, 1989, 1991, 1992, 1993, 1996 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* 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'. - - Note that the first two words of this match a struct nameseq. */ - -struct dep - { - struct dep *next; - char *name; - struct file *file; - unsigned int changed : 8; - unsigned int ignore_mtime : 1; - }; - - -/* Structure used in chains of names, for parsing and globbing. */ - -struct nameseq - { - struct nameseq *next; - char *name; - }; - - -extern struct nameseq *multi_glob PARAMS ((struct nameseq *chain, unsigned int size)); -#ifdef VMS -extern struct nameseq *parse_file_seq (); -#else -extern struct nameseq *parse_file_seq PARAMS ((char **stringp, int stopchar, unsigned int size, int strip)); -#endif -extern char *tilde_expand PARAMS ((char *name)); - -#ifndef NO_ARCHIVES -extern struct nameseq *ar_glob PARAMS ((char *arname, char *member_pattern, unsigned int size)); -#endif - -#ifndef iAPX286 -#define dep_name(d) ((d)->name == 0 ? (d)->file->name : (d)->name) -#else -/* Buggy compiler can't hack this. */ -extern char *dep_name (); -#endif - -extern struct dep *copy_dep_chain PARAMS ((struct dep *d)); -extern struct dep *read_all_makefiles PARAMS ((char **makefiles)); -extern int eval_buffer PARAMS ((char *buffer)); -extern int update_goal_chain PARAMS ((struct dep *goals, int makefiles)); -extern void uniquize_deps PARAMS ((struct dep *)); diff --git a/src/gmake/dir.c b/src/gmake/dir.c deleted file mode 100644 index 9ab4ffc7..00000000 --- a/src/gmake/dir.c +++ /dev/null @@ -1,1200 +0,0 @@ -/* Directory hashing for GNU Make. -Copyright (C) 1988, 1989, 1991, 1992, 1993, 1994, 1995, 1996, 1997, -2002,2003 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" -#include "hash.h" - -#ifdef HAVE_DIRENT_H -# include -# define NAMLEN(dirent) strlen((dirent)->d_name) -# ifdef VMS -extern char *vmsify PARAMS ((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 char * -dosify (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; *filename != '\0' && i < 8 && *filename != '.'; ++i) - *df++ = tolower ((unsigned char)*filename++); - - /* Now skip to the next dot. */ - while (*filename != '\0' && *filename != '.') - ++filename; - if (*filename != '\0') - { - *df++ = *filename++; - for (i = 0; *filename != '\0' && i < 3 && *filename != '.'; ++i) - *df++ = tolower ((unsigned char)*filename++); - } - - /* Look for more dots. */ - while (*filename != '\0' && *filename != '.') - ++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 char * -downcase (char *filename) -{ -#ifdef _AMIGA - static char new_filename[136]; -#else - static char new_filename[PATH_MAX]; -#endif - char *df; - int i; - - if (filename == 0) - return 0; - - df = new_filename; - - /* First, transform the name part. */ - for (i = 0; *filename != '\0'; ++i) - { - *df++ = tolower ((unsigned char)*filename); - ++filename; - } - - *df = 0; - - return new_filename; -} -#endif /* HAVE_CASE_INSENSITIVE_FS */ - -#ifdef VMS - -static int -vms_hash (char *name) -{ - int h = 0; - int g; - - while (*name) - { - unsigned char uc = *name; - h = (h << 4) + (isupper (uc) ? tolower (uc) : uc); - 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 (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) - { - *s++ = 0; - st->st_dev = (char *)vms_hash (name); - h = vms_hash (s); - *(s-1) = ':'; - } - else - { - st->st_dev = 0; - s = name; - h = vms_hash (s); - } - - 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) -{ - struct directory_contents const *key = (struct directory_contents const *) 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) -{ - struct directory_contents const *key = (struct directory_contents const *) 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; -} - -static int -directory_contents_hash_cmp (const void *xv, const void *yv) -{ - struct directory_contents const *x = (struct directory_contents const *) xv; - struct directory_contents const *y = (struct directory_contents const *) yv; - int result; - -#ifdef WINDOWS32 - ISTRING_COMPARE (x->path_key, y->path_key, result); - if (result) - return result; - result = x->ctime - y->ctime; - if (result) - return result; -#else -# ifdef VMS - result = x->ino[0] - y->ino[0]; - if (result) - return result; - result = x->ino[1] - y->ino[1]; - if (result) - return result; - result = x->ino[2] - y->ino[2]; - if (result) - return result; -# else - result = x->ino - y->ino; - if (result) - return result; -# endif -#endif /* WINDOWS32 */ - - return x->dev - y->dev; -} - -/* Table of directory contents hashed by device and inode number. */ -static struct hash_table directory_contents; - -struct directory - { - 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 (((struct directory const *) key)->name); -} - -static unsigned long -directory_hash_2 (const void *key) -{ - return_ISTRING_HASH_2 (((struct directory const *) key)->name); -} - -static int -directory_hash_cmp (const void *x, const void *y) -{ - return_ISTRING_COMPARE (((struct directory const *) x)->name, - ((struct directory const *) 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 - { - 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) -{ - struct dirfile const *x = ((struct dirfile const *) xv); - struct dirfile const *y = ((struct dirfile const *) 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 PARAMS ((struct directory_contents *dir, char *filename)); -static struct directory *find_directory PARAMS ((char *name)); - -/* Find the directory named NAME and return its `struct directory'. */ - -static struct directory * -find_directory (char *name) -{ - register char *p; - register struct directory *dir; - register struct directory **dir_slot; - struct directory dir_key; - int r; -#ifdef WINDOWS32 - char* w32_path; - char fs_label[BUFSIZ]; - char fs_type[BUFSIZ]; - long fs_serno; - long fs_flags; - long fs_len; -#endif -#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)) - { - struct stat st; - - /* The directory was not found. Create a new entry for it. */ - - p = name + strlen (name); - dir = (struct directory *) xmalloc (sizeof (struct directory)); - dir->name = savestring (name, p - name); - 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 WINDOWS32 - /* Remove any trailing '\'. Windows32 stat fails even on valid - directories if they end in '\'. */ - if (p[-1] == '\\') - p[-1] = '\0'; -#endif - -#ifdef VMS - r = vmsstat_dir (name, &st); -#else - EINTRLOOP (r, stat (name, &st)); -#endif - -#ifdef WINDOWS32 - /* Put back the trailing '\'. If we don't, we're permanently - truncating the value! */ - if (p[-1] == '\0') - p[-1] = '\\'; -#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. */ - - 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. */ - - 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. */ - (void) dir_contents_file_exists_p (dc, (char *) 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, char *filename) -{ - unsigned int hash; - 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 - - hash = 0; - 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 = (struct dirfile *) 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 - && (dir->fs_flags & FS_FAT - || (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; - - /* make sure directory can still be opened */ - dir->dirstream = opendir(dir->path_key); - - if (dir->dirstream) - rehash = 1; - else - return 0; /* couldn't re-read - fail */ - } - 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) - 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 = (struct dirfile *) xmalloc (sizeof (struct dirfile)); - df->name = savestring (d->d_name, len); - 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 && strieq (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 (char *dirname, 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 (char *name) -{ - char *dirend; - char *dirname; - 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 == (char *)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. */ - { - 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 - { -#ifdef HAVE_DOS_PATHS - /* d:/ and d: are *very* different... */ - if (dirend < name + 3 && name[1] == ':' && - (*dirend == '/' || *dirend == '\\' || *dirend == ':')) - dirend++; -#endif - dirname = (char *) alloca (dirend - name + 1); - bcopy (name, dirname, dirend - name); - dirname[dirend - name] = '\0'; - } - 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 (char *filename) -{ - char *dirend; - register char *p = filename; - register struct directory *dir; - register 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. */ - { - 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 - { - char *dirname; - char *slash = dirend; - if (dirend == p) - dirname = "/"; - else - { -#ifdef HAVE_DOS_PATHS - /* d:/ and d: are *very* different... */ - if (dirend < p + 3 && p[1] == ':' && - (*dirend == '/' || *dirend == '\\' || *dirend == ':')) - dirend++; -#endif - dirname = (char *) alloca (dirend - p + 1); - bcopy (p, dirname, dirend - p); - dirname[dirend - p] = '\0'; - } - 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 = (struct directory_contents *) - xmalloc (sizeof (struct directory_contents)); - bzero ((char *) dir->contents, 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 = (struct dirfile *) xmalloc (sizeof (struct dirfile)); - new->name = xstrdup (filename); - new->length = strlen (filename); - new->impossible = 1; - hash_insert (&dir->contents->dirfiles, new); -} - -/* Return nonzero if FILENAME has been marked impossible. */ - -int -file_impossible_p (char *filename) -{ - char *dirend; - register char *p = filename; - register struct directory_contents *dir; - register 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. */ - { - 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 - { - char *dirname; - char *slash = dirend; - if (dirend == filename) - dirname = "/"; - else - { -#ifdef HAVE_DOS_PATHS - /* d:/ and d: are *very* different... */ - if (dirend < filename + 3 && filename[1] == ':' && - (*dirend == '/' || *dirend == '\\' || *dirend == ':')) - dirend++; -#endif - dirname = (char *) alloca (dirend - filename + 1); - bcopy (p, dirname, dirend - p); - dirname[dirend - p] = '\0'; - } - dir = find_directory (dirname)->contents; - p = 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 (p); -#endif -#ifdef HAVE_CASE_INSENSITIVE_FS - filename = downcase (p); -#endif -#ifdef VMS - filename = vmsify (p, 1); -#endif - - dirfile_key.name = filename; - dirfile_key.length = strlen (filename); - dirfile = (struct 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. */ - -char * -dir_name (char *dir) -{ - return find_directory (dir)->name; -} - -/* Print the data base of directories. */ - -void -print_dir_data_base (void) -{ - register unsigned int files; - register unsigned int impossible; - register struct directory **dir_slot; - register 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++) - { - register 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 - { - register unsigned int f = 0; - register unsigned int im = 0; - register struct dirfile **files_slot; - register 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++) - { - register 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 PARAMS ((const char *)); -static struct dirent *read_dirstream PARAMS ((__ptr_t)); - -static __ptr_t -open_dirstream (const char *directory) -{ - struct dirstream *new; - struct directory *dir = find_directory ((char *)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. */ - - (void) dir_contents_file_exists_p (dir->contents, (char *) 0); - - new = (struct dirstream *) 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) -{ - 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; - static char *buf; - static unsigned int bufsz; - - while (ds->dirfile_slot < dirfile_end) - { - register 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; - if (sizeof *d - sizeof d->d_name + len > bufsz) - { - if (buf != 0) - free (buf); - bufsz *= 2; - if (sizeof *d - sizeof d->d_name + len > bufsz) - bufsz = sizeof *d - sizeof d->d_name + len; - buf = xmalloc (bufsz); - } - d = (struct dirent *) buf; -#ifdef __MINGW32__ -# if __MINGW32_VERSION_MAJOR < 3 || (__MINGW32_VERSION_MAJOR == 3 && \ - __MINGW32_VERSION_MINOR == 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; -} - -static void -ansi_free(void *p) -{ - if (p) - free(p); -} - -/* 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. - */ -#ifndef stat -# ifndef VMS -extern int stat PARAMS ((const char *path, struct stat *sbuf)); -# endif -# define local_stat stat -#else -static int -local_stat (const char *path, struct stat *buf) -{ - int e; - - EINTRLOOP (e, stat (path, buf)); - return e; -} -#endif - -void -dir_setup_glob (glob_t *gl) -{ - /* Bogus sunos4 compiler complains (!) about & before functions. */ - gl->gl_opendir = open_dirstream; - gl->gl_readdir = read_dirstream; - gl->gl_closedir = ansi_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/src/gmake/doc/.cvsignore b/src/gmake/doc/.cvsignore deleted file mode 100644 index 94240d64..00000000 --- a/src/gmake/doc/.cvsignore +++ /dev/null @@ -1,7 +0,0 @@ -Makefile Makefile.in -fdl.texi make-stds.texi texinfo.tex -make.info* -make*.html -make.aux make.cp make.cps make.fn make.fns make.ky -make.pg make.toc make.tp make.vr make.log -make.dvi make.ps make.pdf diff --git a/src/gmake/doc/Makefile.am b/src/gmake/doc/Makefile.am deleted file mode 100644 index ba7eef34..00000000 --- a/src/gmake/doc/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -# -*-Makefile-*-, or close enough - -TEXI2HTML = texi2html -TEXI2HTML_FLAGS = -split_chapter - -info_TEXINFOS = make.texi -make_TEXINFOS = fdl.texi make-stds.texi - -CLEANFILES = make*.html - -## ----------------------------- ## -## Other documentation formats. ## -## ----------------------------- ## - -html: make_1.html - -make_1.html: $(info_TEXINFOS) $(make_TEXINFOS) - $(TEXI2HTML) $(TEXI2HTML_FLAGS) $(srcdir)/make.texi - -.PHONY: html diff --git a/src/gmake/doc/make.texi b/src/gmake/doc/make.texi deleted file mode 100644 index c4d5851c..00000000 --- a/src/gmake/doc/make.texi +++ /dev/null @@ -1,10323 +0,0 @@ -\input texinfo @c -*- Texinfo -*- -@c %**start of header -@setfilename make.info -@settitle GNU @code{make} -@setchapternewpage odd -@c %**end of header - -@c FSF publishers: format makebook.texi instead of using this file directly. - -@set RCSID $Id: make.texi,v 1.16 2003/11/03 22:04:12 psmith Exp $ -@set EDITION 0.61 -@set VERSION 3.81 -@set UPDATED 02 May 2003 -@set UPDATE-MONTH May 2003 -@comment The ISBN number might need to change on next publication. -@set ISBN 1-882114-81-7 @c From Brian Youmans <3diff@gnu.org>, 25 Apr 2000 - -@c finalout - -@c ISPELL CHECK: done, 10 June 1993 --roland -@c ISPELL CHECK: done, 2000-06-25 --Martin Buchholz - -@c Combine the variable and function indices: -@syncodeindex vr fn -@c Combine the program and concept indices: -@syncodeindex pg cp - -@dircategory GNU Packages -@direntry -* Make: (make). Remake files automatically. -@end direntry - -@ifnottex -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 @value{EDITION}, last updated @value{UPDATED}, -of @cite{The GNU Make Manual}, for @code{make}, Version @value{VERSION}. - -Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003 -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.1 or -any later version published by the Free Software Foundation; with no -Invariant Sections, with no Front-Cover Texts, and with no Back-Cover -Texts. A copy of the license is included in the section entitled -``GNU Free Documentation License''. -@end ifnottex - -@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{UPDATE-MONTH} -@author Richard M. Stallman, Roland McGrath, Paul Smith -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, -1996, 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc. -@sp 2 -Published by the Free Software Foundation @* -59 Temple Place -- Suite 330, @* -Boston, MA 02111-1307 USA @* -ISBN @value{ISBN} @* - -Permission is granted to copy, distribute and/or modify this document -under the terms of the GNU Free Documentation License, Version 1.1 or -any later version published by the Free Software Foundation; with the -Invariant Sections being ``GNU General Public License'', the Front-Cover -Texts being ``A GNU Manual'', and with the Back-Cover Texts being 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: - -@quotation - You have freedom to copy and modify this GNU Manual, like GNU - software. Copies published by the Free Software Foundation raise - funds for GNU development. -@end quotation -@sp 2 -Cover art by Etienne Suvasa. -@end titlepage -@page - -@ifnottex -@node Top, Overview, (dir), (dir) -@top Make - -The GNU @code{make} utility automatically determines which pieces of a -large program need to be recompiled, and issues the commands to -recompile them.@refill - -This edition of the @cite{GNU Make Manual}, -last updated @value{UPDATED}, -documents GNU @code{make} Version @value{VERSION}.@refill - -This manual describes @code{make} and contains the following chapters:@refill -@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. -* Commands:: Commands 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. -* 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 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 Commands -* 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. -* MAKEFILE_LIST Variable:: Discover which makefiles have been read. -* Special Variables:: Other special variables. -* Remaking Makefiles:: How makefiles get remade. -* Overriding Makefiles:: How to override part of one makefile - with another makefile. -* Reading Makefiles:: How makefiles are parsed. - -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 commands - 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. -* Commands/Search:: How to write shell commands 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 the Commands in Rules - -* Echoing:: How to control when commands are echoed. -* Execution:: How commands are executed. -* Parallel:: How commands can be executed in parallel. -* Errors:: What happens after a command execution error. -* Interrupts:: What happens when a command is interrupted. -* Recursion:: Invoking @code{make} from makefiles. -* Sequences:: Defining canned sequences of commands. -* Empty Commands:: Defining useful, do-nothing commands. - -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. -* Defining:: An alternate way to set a variable - to a verbatim string. -* 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. - -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. -* Foreach Function:: Repeat some text with controlled variation. -* If Function:: Conditionally expand a value. -* 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. -* Shell Function:: Substitute the output of a shell command. -* Make Control Functions:: Functions that control how make runs. - -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 commands - 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 commands for updating a file. -* Catalogue of Rules:: A list of built-in implicit 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 defining commands 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 - commands 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. - -Makefile Conventions - -* Makefile Basics:: General Conventions for Makefiles -* Utilities in Makefiles:: Utilities in Makefiles -* Command Variables:: Variables for Specifying Commands -* Directory Variables:: Variables for Installation Directories -* Standard Targets:: Standard Targets for Users -* Install Command Categories:: Three categories of commands in the `install' - -Copying This Manual - -@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 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 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 commands 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 commands: 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 Commands -* 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 commands, introduction to -@example -@group -@var{target} @dots{} : @var{prerequisites} @dots{} - @var{command} - @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{command} is an action that @code{make} carries out. -A rule may have more than one command, each on its own line. -@strong{Please note:} you need to put a tab character at the beginning of -every command line! This is an obscurity that catches the unwary. - -Usually a command is in a rule with prerequisites and serves to create a -target file if any of the prerequisites change. However, the rule that -specifies commands 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 commands 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. -@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. -Commands 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 shell command follows each line that contains a target and -prerequisites. These shell commands say how to update the target file. -A tab character must come at the beginning of every command line to -distinguish commands lines from other lines in the makefile. (Bear in -mind that @code{make} does not know anything about how the commands -work. It is up to you to supply commands that will update the target -file properly. All @code{make} does is execute the commands in the rule -you have specified when the target file needs to be updated.) -@cindex shell command - -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 commands. 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 Commands}, 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. @xref{Goals, , Arguments to Specify the Goals}.) -@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 Commands -@cindex deducing commands (implicit rules) -@cindex implicit rule, introduction to -@cindex rule, implicit, introduction to - -It is not necessary to spell out the commands 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 command @samp{cc -c main.c -o main.o} to compile @file{main.c} into -@file{main.o}. We can therefore omit the commands 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 commands. - -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 Commands}.) - -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 -Commands}.) - -@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. -* MAKEFILE_LIST Variable:: Discover which makefiles have been read. -* Special Variables:: Other special variables. -* Remaking Makefiles:: How makefiles get remade. -* Overriding Makefiles:: How to override part of one makefile - with another makefile. -* Reading Makefiles:: How makefiles are parsed. -@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 commands 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 commands 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 a command 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{Defining, ,Defining Variables Verbatim}). -@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. - -Within a command script (if the line begins with a TAB character) the -entire line is passed to the shell, just as with any other line that -begins with a TAB. The shell decides how to interpret the text: -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 command script text, depending on the -context in which the variable is evaluated. -@end itemize - -@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. -@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 -a tab is not allowed. (If the line begins with a tab, it will be -considered a command 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 -and 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} do not exist. -For compatibility with some other @code{make} implementations, -@code{sinclude} is another name for @w{@code{-include}}. - -@node MAKEFILES Variable, MAKEFILE_LIST Variable, 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 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 MAKEFILE_LIST Variable, Special Variables, MAKEFILES Variable, Makefiles -@comment node-name, next, previous, up -@section The Variable @code{MAKEFILE_LIST} -@cindex makefiles, and @code{MAKEFILE_LIST} variable -@cindex including (@code{MAKEFILE_LIST} variable) - -As @code{make} reads various makefiles, including any obtained from the -@code{MAKEFILES} variable, the command line, the default files, or -from @code{include} directives, their names will be automatically -appended to the @code{MAKEFILE_LIST} variable. They are added right -before @code{make} begins to parse them. - -This means that 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 := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) - -include inc.mk - -name2 := $(word $(words $(MAKEFILE_LIST)),$(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 - -@xref{Text Functions}, for more information on the @code{word} and -@code{words} functions used above. @xref{Flavors, The Two Flavors of -Variables}, for more information on simply-expanded (@code{:=}) -variable definitions. - -@node Special Variables, Remaking Makefiles, MAKEFILE_LIST Variable, Makefiles -@comment node-name, next, previous, up -@section Other Special Variables -@cindex makefiles, and special variables -@cindex special variables - -GNU @code{make} also supports a special variable. Note that any value -you assign to this variable will be ignored; it will always return its -special value. - -@vindex $(.VARIABLES) -@vindex .VARIABLES @r{(list of variables)} -The first special variable is @code{.VARIABLES}. When expanded, the -value consists of a list of the @emph{names} of all global variables -defined in all makefiles read up until that point. 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. - -@c @vindex $(.TARGETS) -@c @vindex .TARGETS @r{(list of 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. - -@node Remaking Makefiles, Overriding Makefiles, Special Variables, 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 lookup to do so. For example, you can write an -explicit rule with the makefile as the target, and an empty command -string (@pxref{Empty Commands, ,Using Empty Commands}). - -If the makefiles specify a double-colon rule to remake a file with -commands 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 commands 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 commands 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 the Commands}), -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 commands to update @file{foo} and its prerequisites -without running them. The commands printed for @file{foo} will be those -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 commands needed to update it without actually -running them, and then print the commands needed to update @file{foo} -without running them. The commands for @file{foo} will be those -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, if the two makefiles give different commands for the same -target, @code{make} will not let you just do this. 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 command -@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 -commands 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 commands will be run even -if the target file already exists. We give @file{force} target empty -commands 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, , 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 -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 define, expansion - -Variable definitions are parsed as follows: - -@example -@var{immediate} = @var{deferred} -@var{immediate} ?= @var{deferred} -@var{immediate} := @var{immediate} -@var{immediate} += @var{deferred} or @var{immediate} - -define @var{immediate} - @var{deferred} -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{:=}), and deferred otherwise. - -@subheading Conditional Statements -@cindex ifdef, expansion -@cindex ifeq, expansion -@cindex ifndef, expansion -@cindex ifneq, expansion - -All instances of conditional syntax are parsed immediately, in their -entirety; this includes the @code{ifdef}, @code{ifeq}, @code{ifndef}, -and @code{ifneq} forms. - -@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 commands used to construct the target are always deferred. This -general rule is true for explicit rules, pattern rules, suffix rules, -static pattern rules, and simple prerequisite definitions. - -@node Rules, Commands, 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 -@dfn{commands} 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 commands - 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, which is @samp{cc -c -g foo.c}. -The command line starts with a tab to identify it as a command. - -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 command 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{command} - @dots{} -@end example - -@noindent -or like this: - -@example -@var{targets} : @var{prerequisites} ; @var{command} - @var{command} - @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 commands -@cindex tab character (in commands) -The @var{command} lines start with a tab character. The first command 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. @xref{Commands, ,Writing the Commands in Rules}. - -@cindex dollar sign (@code{$}), in rules -@cindex @code{$}, in rules -@cindex rule, and @code{$} -Because dollar signs are used to start variable references, if you really -want a dollar sign in a rule you must write two of them, @samp{$$} -(@pxref{Using Variables, ,How to Use Variables}). -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 @var{commands}. These are lines to be -executed by the shell (normally @samp{sh}), but with some extra features -(@pxref{Commands, ,Writing the Commands 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 of -execution of build commands: any commands necessary to build any of a -target's prerequisites will be fully executed before any commands -necessary to build the target. 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. 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 are a strict superset of the -behavior of an order-only prerequisite). - -@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 happens automatically in targets, in prerequisites, -and in commands (where the shell does the 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 commands 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, -prerequisite or command, wildcard expansion will take place at that time. -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. -* Commands/Search:: How to write shell commands 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{VPATH} specifies a search list that -@code{make} applies for all files, including files which are 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{Commands/Search, ,Writing Shell -Commands 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, Commands/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 Commands/Search, Implicit/Search, Search Algorithm, Directory Search -@subsection Writing Shell Commands with Directory Search -@cindex shell command, and directory search -@cindex directory search (@code{VPATH}), and shell commands - -When a prerequisite is found in another directory through directory search, -this cannot change the commands of the rule; they will execute as written. -Therefore, you must write the commands with care so that they 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 commands. 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, Commands/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 commands 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} 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). - -If that file is not found, then the file @file{lib@var{name}.a} is -searched for, in the same directories as above. - -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 that library filename. If no library is found, the next -word in the list will be used. - -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. It is just a -name for some commands 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 commands will not create the target file, the -commands 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 -The phony target will cease to work if anything ever does create a file -named @file{clean} in this directory. Since it has no prerequisites, the -file @file{clean} would inevitably be considered up to date, and its -commands would not be executed. To avoid this problem, you can explicitly -declare the target to be phony, using the special target @code{.PHONY} -(@pxref{Special Targets, ,Special Built-in Target Names}) as follows: - -@example -.PHONY : clean -@end example - -@noindent -Once this is done, @samp{make clean} will run the commands regardless of -whether there is a file named @file{clean}. - -Since it knows that phony targets do not name actual files that could be -remade from other files, @code{make} skips the implicit rule search for -phony targets (@pxref{Implicit Rules}). This is why declaring a target -phony is good for performance, even if you are not worried about the -actual file existing. - -Thus, you first write the line that states that @code{clean} is a -phony target, then you write the rule, like this: - -@example -@group -.PHONY: clean -clean: - rm *.o temp -@end group -@end example - -Another example of the usefulness of phony targets is in conjunction -with recursive invocations of @code{make} (for more information, see -@ref{Recursion, ,Recursive Use of @code{make}}). In this case the -makefile will often contain a variable which lists a number of -subdirectories to be built. One way to handle this is with one rule -whose command is a shell loop over the subdirectories, like this: - -@example -@group -SUBDIRS = foo bar baz - -subdirs: - for dir in $(SUBDIRS); do \ - $(MAKE) -C $$dir; \ - done -@end group -@end example - -There are a few problems with this method, however. First, any error -detected in a submake is not noted 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 the parallel build capabilities of make using this -method, since there is only one rule. - -By declaring the subdirectories as phony targets (you must do this as -the subdirectory 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} subdirectory cannot be -built until after the @file{baz} subdirectory is complete; this kind of -relationship declaration is particularly important when attempting -parallel builds. - -A phony target should not be a prerequisite of a real target file; if it -is, its commands are 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 commands 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}). - -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 Commands or Prerequisites -@cindex force targets -@cindex targets, force -@cindex @code{FORCE} -@cindex rule, no commands or prerequisites - -If a rule has no prerequisites or commands, 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 commands 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 commands. -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 -commands 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 commands were last executed. It -does so because one of the commands 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 -commands are 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 commands 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 commands specified for @code{.DEFAULT} are used for any target for -which no rules are found (either explicit rules or implicit rules). -@xref{Last Resort}. If @code{.DEFAULT} commands are specified, every -file mentioned as a prerequisite, but not as a target in a rule, will have -these commands 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 commands, 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 .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 commands exit with a nonzero exit status, just as it -does when it receives a signal. @xref{Errors, ,Errors in Commands}. - -@findex .IGNORE -@item .IGNORE - -If you specify prerequisites for @code{.IGNORE}, then @code{make} will -ignore errors in execution of the commands run for those particular -files. The commands for @code{.IGNORE} are not meaningful. - -If mentioned as a target with no prerequisites, @code{.IGNORE} says to -ignore errors in execution of commands for all files. This usage of -@samp{.IGNORE} is supported only for historical compatibility. Since -this affects every command in the makefile, it is not very useful; we -recommend you use the more selective ways to ignore errors in specific -commands. @xref{Errors, ,Errors in Commands}. - -@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 commands for -@code{.LOW_RESOLUTION_TIME} are not meaningful. - -The high resolution file time stamps of many modern hosts lessen the -chance of @command{make} incorrectly concluding that a file is up to -date. Unfortunately, these hosts provide no 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 subsecond 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 subsecond 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 commands to remake those particular files before executing -them. The commands for @code{.SILENT} are not meaningful. - -If mentioned as a target with no prerequisites, @code{.SILENT} says not -to print any commands 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 commands. -@xref{Echoing, ,Command Echoing}. If you want to silence all commands -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 be run in -parallel (unless its makefile contains this target). Any prerequisites -on this target are ignored. -@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 commands apply to -all the targets, but their effects may vary because you can substitute the -actual target name into the command 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 commands. 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 commands work for all the targets. The commands 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 commands. -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 commands are executed. - -There can only be one set of commands to be executed for a file. If -more than one rule gives commands for the same file, @code{make} uses -the last set 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}... you should avoid using it). Occasionally it is -useful to have the same target invoke multiple commands 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 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 commands, then @code{make} -searches for an applicable implicit rule to find some commands -@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{commands} - @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 nonmatching 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 commands 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 commands, 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 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. - -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 commands -are executed if the target is older than any prerequisites of that rule. -If there are no prerequisites for that rule, its commands are 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 commands 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 commands; 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 prerequisite 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.info, 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 target in your makefiles or run the risk of having a random -object file become the default target. -@xref{How Make Works}. - -@node Commands, Using Variables, Rules, Top -@chapter Writing the Commands in Rules -@cindex commands, how to write -@cindex rule commands -@cindex writing rule commands - -The commands of a rule consist of shell command lines to be executed one -by one. Each command line must start with a tab, except that the first -command line may be attached to the target-and-prerequisites line with a -semicolon in between. Blank lines and lines of just comments may appear -among the command lines; they are ignored. (But beware, an apparently -``blank'' line that begins with a tab is @emph{not} blank! It is an -empty command; @pxref{Empty Commands}.) - -Users use many different shell programs, but commands in makefiles are -always interpreted by @file{/bin/sh} unless the makefile specifies -otherwise. @xref{Execution, ,Command Execution}. - -@cindex comments, in commands -@cindex commands, comments in -@cindex @code{#} (comments), in commands -The shell that is in use determines whether comments can be written on -command lines, and what syntax they use. When the shell is -@file{/bin/sh}, a @samp{#} starts a comment that extends to the end of -the line. The @samp{#} does not have to be at the beginning of a line. -Text on a line before a @samp{#} is not part of the comment. - -@menu -* Echoing:: How to control when commands are echoed. -* Execution:: How commands are executed. -* Parallel:: How commands can be executed in parallel. -* Errors:: What happens after a command execution error. -* Interrupts:: What happens when a command is interrupted. -* Recursion:: Invoking @code{make} from makefiles. -* Sequences:: Defining canned sequences of commands. -* Empty Commands:: Defining useful, do-nothing commands. -@end menu - -@node Echoing, Execution, Commands, Commands -@section Command Echoing -@cindex echoing of commands -@cindex silent operation -@cindex @code{@@} (in commands) -@cindex commands, echoing -@cindex printing of commands - -Normally @code{make} prints each command line before it is executed. -We call this @dfn{echoing} because it gives the appearance that you -are typing the commands yourself. - -When a line starts with @samp{@@}, the echoing of that line is suppressed. -The @samp{@@} is discarded before the command 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 commands, it won't execute them. @xref{Options Summary, -,Summary of Options}. In this case and only this case, even the -commands starting with @samp{@@} are printed. This flag is useful for -finding out which commands @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 commands -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, Commands -@section Command Execution -@cindex commands, execution -@cindex execution, of commands -@cindex shell command, execution -@vindex SHELL @r{(command execution)} - -When it is time to execute commands to update a target, they are executed -by making a new subshell for each line. (In practice, @code{make} may -take shortcuts that do not affect the results.) - -@cindex @code{cd} (shell command) -@strong{Please note:} this implies that shell commands such as @code{cd} -that set variables local to each process will not affect the following -command lines. @footnote{On MS-DOS, the value of current working -directory is @strong{global}, so changing it @emph{will} affect the -following command lines on those systems.} If you want to use @code{cd} -to affect the next command, put the two on a single line with a -semicolon between them. Then @code{make} will consider them a single -command and pass them, together, to a shell which will execute them in -sequence. For example: - -@example -foo : bar/lose - cd bar; gobble lose > ../foo -@end example - -@cindex commands, backslash (@code{\}) in -@cindex commands, quoting newlines in -@cindex backslash (@code{\}), in commands -@cindex @code{\} (backslash), in commands -@cindex quoting newline, in commands -@cindex newline, quoting, in commands -If you would like to split a single shell command into multiple lines of -text, you must use a backslash at the end of all but the last subline. -Such a sequence of lines is combined into a single line, by deleting the -backslash-newline sequences, before passing it to the shell. Thus, the -following is equivalent to the preceding example: - -@example -@group -foo : bar/lose - cd bar; \ - gobble lose > ../foo -@end group -@end example - -@vindex SHELL -The program used as the shell is taken from the variable @code{SHELL}. -By default, the program @file{/bin/sh} is used. - -@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 -says @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}. - -@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}. 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; this will -override the value of @code{SHELL}. - -@node Parallel, Errors, Execution, Commands -@section Parallel Execution -@cindex commands, 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 commands at once. -Normally, @code{make} will execute only one command 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 commands -simultaneously.@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 -commands 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). - -One unpleasant consequence of running several commands simultaneously is -that output generated by the commands appears whenever each command -sends it, so messages from different commands may be interspersed. - -Another problem is that two processes cannot both take input from the -same device; so to make sure that only one command tries to take input -from the terminal at once, @code{make} will invalidate the standard -input streams of all but one running command. This means that -attempting to read from standard input will usually be a fatal error (a -@samp{Broken pipe} signal) for most child processes if there are -several. -@cindex broken pipe -@cindex standard input - -It is unpredictable which command 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 command run will always get it first, and -the first command 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 command 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 commands. - -Finally, handling recursive @code{make} invocations raises issues. For -more information on this, see -@ref{Options/Recursion, ,Communicating Options to a Sub-@code{make}}. - -If a command fails (is killed by a signal or exits with a nonzero -status), and errors are not ignored for that command -(@pxref{Errors, ,Errors in Commands}), -the remaining command lines to remake the same target will not be run. -If a command 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. - -@node Errors, Interrupts, Parallel, Commands -@section Errors in Commands -@cindex errors (in commands) -@cindex commands, errors in -@cindex exit status (errors) - -After each shell command returns, @code{make} looks at its exit status. -If the command completed successfully, the next command line is executed -in a new shell; after the last command 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 command 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 commands) -To ignore errors in a command line, write a @samp{-} at the beginning of -the line's text (after the initial tab). The @samp{-} is discarded before -the command 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{rm} to continue even if it 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 commands 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 command 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 -commands 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 command 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 command is killed by a -signal; @pxref{Interrupts}. So generally the right thing to do is to -delete the target file if the command 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, Commands -@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 command is executing, it may -delete the target file that the command 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, Sequences, Interrupts, Commands -@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 subdirectory @file{subdir} which has its own makefile, and you would -like the containing directory's makefile to run @code{make} on the -subdirectory. 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 command 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 commands -As a special feature, using the variable @code{MAKE} in the commands 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 command line. @xref{Instead of -Execution, ,Instead of Executing the Commands}.@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 commands; 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 command, and @samp{-t} says not to execute -commands.@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 command -line of a rule contains the variable @code{MAKE}, the flags @samp{-t}, -@samp{-n} and @samp{-q} do not apply to that line. Command lines -containing @code{MAKE} are executed normally despite the presence of a -flag that causes most commands 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 -commands, 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 do not -override what is specified in the makefile used by the sub-@code{make} -makefile 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 command. 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. - -The special variables @code{SHELL} and @code{MAKEFLAGS} are always -exported (unless you unexport them). -@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 commands 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 command.@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 the Commands}) -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.2 -(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 - -@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 Sequences, Empty Commands, Recursion, Commands -@section Defining Canned Command Sequences -@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 rules 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 sequence of commands: - -@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{Defining, ,Defining Variables Verbatim}, -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 commands 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 command 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 subshell 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{Commands, ,Writing the Commands 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 command lines. - -On the other hand, prefix characters on the command 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} commands. -(@xref{Echoing, ,Command Echoing}, for a full explanation of @samp{@@}.) - -@node Empty Commands, , Sequences, Commands -@section Using Empty Commands -@cindex empty commands -@cindex commands, empty - -It is sometimes useful to define commands which do nothing. This is done -simply by giving a command that consists of nothing but whitespace. For -example: - -@example -target: ; -@end example - -@noindent -defines an empty command string for @file{target}. You could also use a -line beginning with a tab character to define an empty command string, -but this would be confusing because such a line looks empty. - -@findex .DEFAULT@r{, and empty commands} -You may be wondering why you would want to define a command string that -does nothing. The only reason this is useful is to prevent a target -from getting implicit commands (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 command strings 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, Commands, 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, commands, -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 the shell commands in rules, 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 leading or trailing whitespace. However, -variable names containing characters other than letters, numbers, and -underscores should be avoided, as they may be given special meanings in the -future, and with 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 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. -* Defining:: An alternate way to set a variable - to a verbatim string. -* 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. -@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 command. - -Variable references can be used in any context: targets, prerequisites, -commands, 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{Defining, ,Defining Variables Verbatim}). 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 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 command, -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 := -@dfn{Simply expanded variables} are defined by lines using @samp{:=} -(@pxref{Setting, ,Setting Variables}). -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@}) -cur-dir := $(shell pwd) -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' command then looks like this: - -@example -@group -$@{subdirs@}: - $@{MAKE@} cur-dir=$@{cur-dir@}/$@@ -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 -reexpanded 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{Defining, ,Defining Variables Verbatim}).@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 ?= - -To set a variable from the makefile, write a line starting with the -variable name followed by @samp{=} or @samp{:=}. Whatever follows the -@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{:=} 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 swapping space on the computer. When a variable definition is -long, it is a good idea to break it into several lines by inserting -backslash-newline at convenient places in the definition. This will not -affect the functioning of @code{make}, but it will make the makefile easier -to read. - -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 - -@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{:=}, -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 -(@pxref{Setting, ,Setting Variables}, for a full explanation of @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 Implicit 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, Defining, 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}. - -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{Defining, ,Defining Variables Verbatim}. -@end ifnottex - -@node Defining, Environment, Override Directive, Using Variables -@section Defining Variables Verbatim -@findex define -@findex endef -@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{Sequences, ,Defining Canned Command Sequences}), and also -sections of makefile syntax to use with @code{eval} (@pxref{Eval Function}). - -The @code{define} directive is followed on the same line by the name of the -variable 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 @samp{=}: it creates a recursively-expanded variable -(@pxref{Flavors, ,The Two Flavors of Variables}). -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 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 tab -characters are considered part of a command script, so any -@code{define} or @code{endef} strings appearing on such a line will -not be considered @code{make} operators. - -@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 command script, 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 subshell -for each line. @xref{Execution, ,Command 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 Environment, Target-specific, Defining, 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. But 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. (But -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} is invoked recursively, variables defined in the -outer invocation can be passed to inner invocations through the -environment (@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. - -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} ignores the environment value of -@code{SHELL} (except on MS-DOS and MS-Windows, where @code{SHELL} is -usually not set. @xref{Execution, ,Special handling of SHELL on -MS-DOS}.)@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 command script (and in other target-specific assignments). - -Set a target-specific variable value like this: - -@example -@var{target} @dots{} : @var{variable-assignment} -@end example - -@noindent -or like this: - -@example -@var{target} @dots{} : override @var{variable-assignment} -@end example - -@noindent -or like this: - -@example -@var{target} @dots{} : export @var{variable-assignment} -@end example - -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{=}), static (@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. static). - -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 (unless those prerequisites override -it 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 command script for -@file{prog}, but it will also set @code{CFLAGS} to @samp{-g} in the -command scripts that create @file{prog.o}, @file{foo.o}, and -@file{bar.o}, and any command scripts which create their prerequisites. - -@node Pattern-specific, , 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. If a target matches more than one pattern, all the -matching pattern-specific variables are interpreted in the order in -which they were defined in the makefile, and collected together into -one set. Variables defined in this way are searched after any -target-specific variables defined explicitly for that target, and -before target-specific variables defined for the parent target. - -Set a pattern-specific variable value like this: - -@example -@var{pattern} @dots{} : @var{variable-assignment} -@end example - -@noindent -or like this: - -@example -@var{pattern} @dots{} : override @var{variable-assignment} -@end example - -@noindent -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}. - -@node Conditionals, Functions, Using Variables, Top -@chapter Conditional Parts of Makefiles - -@cindex conditionals -A @dfn{conditional} 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 shell -commands 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 -command lines will be used as the command for a 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 - -@noindent -If the condition is true, @var{text-if-true} is used; otherwise, -@var{text-if-false} is used instead. The @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. 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} -If the variable @var{variable-name} 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 variable @var{variable-name} is itself expanded, so -it could be a variable or function that expands to the name of a -variable. - -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. -@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 a command 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 commands 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 command 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. 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. -* Foreach Function:: Repeat some text with controlled variation. -* If Function:: Conditionally expand a value. -* 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. -* Shell Function:: Substitute the output of a shell command. -* Make Control Functions:: Functions that control how make runs. -@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 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} builtin 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} -and @var{e} start from 1. 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 -@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, Foreach Function, 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}. -@end table - -@node Foreach Function, If Function, File Name 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 reexpanded 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 If Function, Call Function, Foreach Function, Functions -@section The @code{if} Function -@findex if -@cindex conditional expansion - -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}). - -An @code{if} function call can contain either two or three arguments: - -@example -$(if @var{condition},@var{then-part}[,@var{else-part}]) -@end example - -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.) - -@node Call Function, Value Function, If 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 builtin function, the builtin 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 builtin 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)_OBJ) $$($(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, Shell 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 defined as an environment variable and the -@samp{-e} option is @emph{not} turned on (@pxref{Options Summary, ,Summary of Options}). - -@item environment override - -if @var{variable} was defined as an environment variable and the -@w{@samp{-e}} option @emph{is} turned on (@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 commands 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 Shell Function, Make Control Functions, Origin Function, Functions -@section The @code{shell} Function -@findex shell -@cindex commands, expansion -@cindex backquotes -@cindex shell command, function for - -The @code{shell} function is unlike any other function except 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 an argument that is a shell command and returns the -output of the command. The only processing @code{make} does on the result, -before substituting it into the surrounding text, is to convert each -newline or carriage-return / newline pair to a single space. It also -removes the trailing (carriage-return and) newline, if it's the last -thing in the result.@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)}}.@refill - -@node Make Control Functions, , Shell 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 command script 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. -@end table - -@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. - -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 the Commands}. -@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 commands - 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 specify a different goal or goals with 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. - -@cindex @code{MAKECMDGOALS} -@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 commands 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 the Commands -@cindex execution, instead of -@cindex commands, 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''. The activity is to print what commands would be used to make -the targets up to date, but not actually execute them. - -@item -t -@itemx --touch -@cindex @code{--touch} -@cindex touching files -@cindex target, touching -@cindex @code{-t} - -``Touch''. The activity is to mark the targets as up to date without -actually changing them. In other words, @code{make} pretends to compile -the targets but does not really change their contents. - -@item -q -@itemx --question -@cindex @code{--question} -@cindex @code{-q} -@cindex question mode - -``Question''. The activity is to find out silently whether the targets -are up to date already; but execute no commands in either case. In other -words, neither compilation nor output will occur. - -@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 commands that it would -normally execute but does not execute them. - -With the @samp{-t} flag, @code{make} ignores the commands 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 -commands, 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 command execution -The @samp{-n}, @samp{-t}, and @samp{-q} options do not affect command -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}.) - -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 commands, the @samp{-W} flag can direct @code{make} to act -as if some files had been modified, without actually modifying the -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 -commands 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 command 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 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{:=} 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 commands 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 these targets are remade, regardless of the status of -their prerequisites. - -@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 subcommands. - -@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. -@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 -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 commands executed to remake files. -@xref{Errors, ,Errors in Commands}. - -@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 jobs (commands) to run simultaneously. With no -argument, @code{make} runs as many jobs 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 commands 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 jobs (commands) should be started if there are -other jobs 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 -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 commands that would be executed, but do not execute them. -@xref{Instead of Execution, ,Instead of Executing the Commands}. - -@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 -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 filename and linenumber information for command 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 commands, 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 the -Commands}.@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 commands as they are executed. -@xref{Echoing, ,Command 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 commands. This is used to pretend that the -commands were done, in order to fool future invocations of -@code{make}. @xref{Instead of Execution, ,Instead of Executing the Commands}. - -@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}.) - -@itemx --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 the Commands}. - -@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 commands 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 commands for updating a file. -* Catalogue of Rules:: A list of built-in implicit 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 defining commands 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 commands yourself. Either -write a rule with no command lines, 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 commands and one or -more prerequisites (the source files). You would want to write a rule -for @file{foo.o} with no command lines 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 Implicit 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 commands. 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 Implicit -Rules}). - -If you do not want an implicit rule to be used for a target that has no -commands, you can give that target empty commands by writing a semicolon -(@pxref{Empty Commands, ,Defining Empty Commands}). - -@node Catalogue of Rules, Implicit Variables, Using Implicit, Implicit Rules -@section Catalogue of Implicit 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. - -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{.p}, @code{.f}, @code{.F}, @code{.r}, @code{.y}, -@code{.l}, @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 command of the form @samp{$(CC) -c $(CPPFLAGS) $(CFLAGS)}.@refill - -@item Compiling C++ programs -@cindex C++, rule to compile -@pindex g++ -@pindex .C -@pindex .cc -@file{@var{n}.o} is made automatically from @file{@var{n}.cc} or -@file{@var{n}.C} with a command of the form @samp{$(CXX) -c $(CPPFLAGS) -$(CXXFLAGS)}. 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 command @samp{$(PC) -c $(PFLAGS)}.@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 command used is as follows:@refill - -@table @samp -@item .f -@samp{$(FC) -c $(FFLAGS)}. -@item .F -@samp{$(FC) -c $(FFLAGS) $(CPPFLAGS)}. -@item .r -@samp{$(FC) -c $(FFLAGS) $(RFLAGS)}. -@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 command used is as follows:@refill - -@table @samp -@item .F -@samp{$(FC) -F $(CPPFLAGS) $(FFLAGS)}. -@item .r -@samp{$(FC) -F $(FFLAGS) $(RFLAGS)}. -@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 command -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 command 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 command 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 -command 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 -command 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 command @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 command 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 command 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 command is @w{@samp{$(LINT) $(LINTFLAGS) $(CPPFLAGS) -i}}. -The same command 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 command -@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 command -@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 command @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 -command 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 -command 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 commands in built-in implicit rules actually use -variables such as @code{COMPILE.c}, @code{LINK.p}, and -@code{PREPROCESS.S}, whose values contain the commands 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 commands in built-in implicit rules make liberal use of certain -predefined variables. You can alter 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 command 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. - -Here is a table of 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 doing assembly; 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 CO -@vindex CO -Program for extracting a file from RCS; default @samp{co}. -@pindex co - -@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 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 C programs or Ratfor programs; -default @samp{lex}. -@pindex lex - -@item PC -@vindex PC -Program for compiling Pascal programs; default @samp{pc}. -@pindex pc - -@item YACC -@vindex YACC -Program to use to turn Yacc grammars into C programs; default @samp{yacc}. -@pindex yacc - -@item YACCR -@vindex YACCR -Program to use to turn Yacc grammars into Ratfor -programs; default @samp{yacc -r}. - -@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}. - -@item LFLAGS -@vindex LFLAGS -Extra flags to give to Lex. - -@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 YFLAGS -@vindex YFLAGS -Extra flags to give to Yacc. -@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 - commands 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 its prerequisite patterns 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{command}@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}. - -@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 -commands. If a pattern rule has multiple targets, @code{make} knows that -the rule's commands are responsible for making all of the targets. The -commands are 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 commands and prerequisites to the file -presently in question. However, when this file's commands are run, the -other targets are marked as having been updated themselves. -@cindex multiple targets, in pattern rule -@cindex target, multiple in pattern rule - -The order in which pattern rules appear in the makefile is important -since this is the order in which they are considered. -Of equally applicable -rules, only the first one found is used. The rules you write take precedence -over those that are built in. Note however, that a rule whose -prerequisites actually exist or are mentioned always takes priority over a -rule with prerequisites that must be made by chaining other implicit rules. -@cindex pattern rules, order of -@cindex order of pattern rules - -@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 command 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 subdirectory @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 command @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 command @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 command, -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 command script. In particular, you cannot use them anywhere -within the target or prerequisite lists of a rule; they have no value -there and will expand to the empty string. A common mistake is -attempting to use @code{$@@} within the prerequisites list in a rule; -this will not work. However, see below for information on the -SysV-style @code{$$@@} variables. - -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 commands 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 commands 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 member named 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 member named 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. -@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 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 $( tar-`sed -e '/version_string/!d' \ - -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ - -e q - version.c`.shar.Z -@end group - -@group -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 - -@raisesections -@include fdl.texi -@lowersections - -@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 - -@summarycontents -@contents -@bye diff --git a/src/gmake/dosbuild.bat b/src/gmake/dosbuild.bat deleted file mode 100644 index f03b6e6a..00000000 --- a/src/gmake/dosbuild.bat +++ /dev/null @@ -1,42 +0,0 @@ -@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 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 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 dir file misc main read remake rule implicit default variable) do echo %%f.o >> respf.$$$ -for %%f in (expand function vpath version ar arscan signame remote-stub getopt getopt1) do echo %%f.o >> respf.$$$ -echo glob/libglob.a >> 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/src/gmake/expand.c b/src/gmake/expand.c deleted file mode 100644 index 8f9f4b1f..00000000 --- a/src/gmake/expand.c +++ /dev/null @@ -1,580 +0,0 @@ -/* Variable expansion functions for GNU Make. -Copyright (C) 1988, 89, 91, 92, 93, 95 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" - -#include - -#include "filedef.h" -#include "job.h" -#include "commands.h" -#include "variable.h" -#include "rule.h" - -/* 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, 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 = (char *) xrealloc (variable_buffer, - variable_buffer_length); - ptr = variable_buffer + offset; - } - - bcopy (string, ptr, 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 = (char *) 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 PARAMS ((const struct variable *v)); - -char * -recursively_expand_for_file (struct variable *v, struct file *file) -{ - char *value; - struct variable_set_list *save = 0; - int set_reading = 0; - - if (v->expanding) - { - if (!v->exp_count) - /* Expanding V causes infinite recursion. Lose. */ - fatal (reading_file, - _("Recursive variable `%s' references itself (eventually)"), - v->name); - --v->exp_count; - } - - if (file) - { - save = current_variable_set_list; - current_variable_set_list = file->variables; - } - - /* If we have no other file-reading context, use the variable's context. */ - if (!reading_file) - { - set_reading = 1; - reading_file = &v->fileinfo; - } - - 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; - - return value; -} - -/* Expand a simple reference to variable NAME, which is LENGTH chars long. */ - -#ifdef __GNUC__ -__inline -#endif -static char * -reference_variable (char *o, char *name, unsigned int length) -{ - register struct variable *v; - char *value; - - v = lookup_variable (name, length); - - if (v == 0) - warn_undefined (name, length); - - if (v == 0 || *v->value == '\0') - 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, char *string, long length) -{ - register struct variable *v; - register char *p, *o, *p1; - char save_char = '\0'; - unsigned int line_offset; - - if (!line) - line = initialize_variable_output(); - - p = string; - o = line; - line_offset = line - variable_buffer; - - if (length >= 0) - { - save_char = string[length]; - string[length] = '\0'; - } - - 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 ? 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 == '(') ? ')' : '}'; - register char *beg = p + 1; - int free_beg = 0; - char *op, *begp; - 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. */ - fatal (reading_file, _("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) - { - beg = expand_argument (beg, p); /* Expand the name. */ - free_beg = 1; /* Remember to free BEG when finished. */ - 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). */ - char *subst_beg, *subst_end, *replace_beg, *replace_end; - - subst_beg = colon + 1; - 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 - { - replace_beg = subst_end + 1; - 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 (v != 0 && *v->value != '\0') - { - char *value = (v->recursive ? recursively_expand (v) - : v->value); - char *pattern, *percent; - if (free_beg) - { - *subst_end = '\0'; - pattern = subst_beg; - } - else - { - pattern = (char *) alloca (subst_end - subst_beg - + 1); - bcopy (subst_beg, pattern, subst_end - subst_beg); - pattern[subst_end - subst_beg] = '\0'; - } - percent = find_percent (pattern); - if (percent != 0) - { - char *replace; - if (free_beg) - { - *replace_end = '\0'; - replace = replace_beg; - } - else - { - replace = (char *) alloca (replace_end - - replace_beg - + 1); - bcopy (replace_beg, replace, - replace_end - replace_beg); - replace[replace_end - replace_beg] = '\0'; - } - - o = patsubst_expand (o, value, pattern, replace, - percent, (char *) 0); - } - else - o = subst_expand (o, value, - pattern, replace_beg, - strlen (pattern), - end - replace_beg, - 0, 1); - 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); - - if (free_beg) - free (beg); - } - 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). */ - { - /* We could do the expanding here, but this way - avoids code repetition at a small performance cost. */ - char name[5]; - name[0] = '$'; - name[1] = '('; - name[2] = *p; - name[3] = ')'; - name[4] = '\0'; - p1 = allocated_variable_expand (name); - o = variable_buffer_output (o, p1, strlen (p1)); - free (p1); - } - - break; - } - - if (*p == '\0') - break; - else - ++p; - } - - if (save_char) - string[length] = save_char; - - (void)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 (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; - - if (str == end) - return xstrdup(""); - - if (!end || *end == '\0') - return allocated_variable_expand ((char *)str); - - tmp = (char *) alloca (end - str + 1); - bcopy (str, tmp, end - str); - tmp[end - str] = '\0'; - - return allocated_variable_expand (tmp); -} - -/* 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. */ - -static char * -variable_expand_for_file (char *line, struct file *file) -{ - char *result; - struct variable_set_list *save; - - if (file == 0) - return variable_expand (line); - - save = current_variable_set_list; - current_variable_set_list = file->variables; - if (file->cmds && file->cmds->fileinfo.filenm) - reading_file = &file->cmds->fileinfo; - else - reading_file = 0; - result = variable_expand (line); - current_variable_set_list = save; - reading_file = 0; - - 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) -{ - const struct variable *v; - char *buf = 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, look to see if there's one in a set above us. */ - if (!v) - return variable_append (name, length, set->next); - - /* 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); - 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); - - return variable_buffer_output (buf, v->value, strlen (v->value)); -} - - -static char * -allocated_variable_append (const struct variable *v) -{ - char *val, *retval; - - /* 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); - variable_buffer_output (val, "", 1); - val = variable_buffer; - - variable_buffer = obuf; - variable_buffer_length = olen; - - /* Now expand it and return that. */ - - retval = allocated_variable_expand (val); - - free (val); - return retval; -} - -/* 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 (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); - -#if 0 - /* Waste a little memory and save time. */ - value = xrealloc (value, strlen (value)) -#endif - - 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/src/gmake/file.c b/src/gmake/file.c deleted file mode 100644 index f043e9cc..00000000 --- a/src/gmake/file.c +++ /dev/null @@ -1,821 +0,0 @@ -/* Target file hash table management for GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, -2002 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" - -#include - -#include "dep.h" -#include "filedef.h" -#include "job.h" -#include "commands.h" -#include "variable.h" -#include "debug.h" -#include "hash.h" - - -/* 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. - enter_file similar, but create one if there is none. */ - -struct file * -lookup_file (char *name) -{ - register struct file *f; - struct file file_key; -#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS) - register char *lname, *ln; -#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 - { - register char *n; - lname = (char *) malloc (strlen (name) + 1); - 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] == '.' && name[1] == '/' && name[2] != '\0') - { - name += 2; - while (*name == '/') - /* Skip following slashes: ".//foo" is "foo", not "/foo". */ - ++name; - } - - if (*name == '\0') - /* It was all slashes after a dot. */ -#ifdef VMS - name = "[]"; -#else -#ifdef _AMIGA - name = ""; -#else - name = "./"; -#endif /* AMIGA */ -#endif /* VMS */ - - file_key.hname = name; - f = (struct file *) hash_find_item (&files, &file_key); -#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS) - free (lname); -#endif - return f; -} - -struct file * -enter_file (char *name) -{ - register struct file *f; - register struct file *new; - register struct file **file_slot; - struct file file_key; -#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS) - char *lname, *ln; -#endif - - assert (*name != '\0'); - -#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS) - { - register char *n; - lname = (char *) malloc (strlen (name) + 1); - for (n = name, ln = lname; *n != '\0'; ++n, ++ln) - { - if (isupper ((unsigned char)*n)) - *ln = tolower ((unsigned char)*n); - else - *ln = *n; - } - - *ln = 0; - /* Creates a possible leak, old value of name is unreachable, but I - currently don't know how to fix it. */ - name = 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) - { -#if defined(VMS) && !defined(WANT_CASE_SENSITIVE_TARGETS) - free(lname); -#endif - return f; - } - - new = (struct file *) xmalloc (sizeof (struct file)); - bzero ((char *) new, sizeof (struct file)); - new->name = new->hname = name; - new->update_status = -1; - - if (HASH_VACANT (f)) - hash_insert_at (&files, new, file_slot); - else - { - /* There is already a double-colon entry for this file. */ - new->double_colon = f; - while (f->prev != 0) - f = f->prev; - f->prev = new; - } - - return new; -} - -/* 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, char *to_hname) -{ - rehash_file (from_file, to_hname); - while (from_file) - { - from_file->name = from_file->hname; - from_file = from_file->prev; - } -} - -/* 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, char *to_hname) -{ - struct file file_key; - struct file **file_slot; - struct file *to_file; - struct file *deleted_file; - struct file *f; - - file_key.hname = to_hname; - if (0 == file_hash_cmp (from_file, &file_key)) - return; - - 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 (); - - deleted_file = hash_delete (&files, from_file); - if (deleted_file != from_file) - /* from_file isn't the one stored in files */ - abort (); - - file_key.hname = to_hname; - file_slot = (struct file **) hash_find_slot (&files, &file_key); - to_file = *file_slot; - - from_file->hname = to_hname; - for (f = from_file->double_colon; f != 0; f = f->prev) - f->hname = to_hname; - - if (HASH_VACANT (to_file)) - hash_insert_at (&files, from_file, file_slot); - else - { - /* 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) - { - /* 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, - _("Commands were 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, - _("Commands for file `%s' were found by implicit rule search,"), - from_file->name); - error (&from_file->cmds->fileinfo, - _("but `%s' is now considered the same file as `%s'."), - from_file->name, to_hname); - error (&from_file->cmds->fileinfo, - _("Commands for `%s' will be ignored in favor of those 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 - { - register 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) - 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) - 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 (ignore_vpath); -#undef MERGE - - from_file->renamed = to_file; - } -} - -/* 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) -{ - register struct file **file_slot; - register 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)) - { - register struct file *f = *file_slot; - if (f->intermediate && (f->dontcare || !f->precious) - && !f->secondary && !f->cmd_target) - { - int status; - if (f->update_status == -1) - /* 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) - 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); - } -} - -/* Set the intermediate flag. */ - -static void -set_intermediate (const void *item) -{ - struct file *f = (struct file *) item; - f->intermediate = 1; -} - -/* 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) -{ - register struct file *f; - register struct file *f2; - register struct dep *d; - register struct file **file_slot_0; - register struct file **file_slot; - register struct file **file_end; - - /* Enter each dependency name as a file. */ - /* We must use hash_dump (), because within this loop - we might add new files to the table, possibly causing - an in-situ table expansion. */ - file_slot_0 = (struct file **) hash_dump (&files, 0, 0); - file_end = file_slot_0 + files.ht_fill; - for (file_slot = file_slot_0; file_slot < file_end; file_slot++) - for (f2 = *file_slot; f2 != 0; f2 = f2->prev) - for (d = f2->deps; d != 0; d = d->next) - if (d->name != 0) - { - d->file = lookup_file (d->name); - if (d->file == 0) - d->file = enter_file (d->name); - else - free (d->name); - d->name = 0; - } - free (file_slot_0); - - 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 and nonexistent. */ - f2->phony = 1; - f2->last_mtime = NONEXISTENT_MTIME; - f2->mtime_before_update = NONEXISTENT_MTIME; - } - - for (f = lookup_file (".INTERMEDIATE"); f != 0; f = f->prev) - { - /* .INTERMEDIATE with deps listed - marks those 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) - { - /* .SECONDARY with deps listed - marks those deps as intermediate files - in that they don't get rebuilt if not actually needed; - but unlike real intermediate files, - these are not deleted after make finishes. */ - 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 (".POSIX"); - if (f != 0 && f->is_target) - posix_pedantic = 1; - - f = lookup_file (".NOTPARALLEL"); - if (f != 0 && f->is_target) - not_parallel = 1; -} - -/* Set the `command_state' member of FILE and all its `also_make's. */ - -void -set_command_state (struct file *file, int 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 s, int ns) -{ - int offset = ORDINARY_MTIME_MIN + (FILE_TIMESTAMP_HI_RES ? ns : 0); - 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]; - ts = s <= OLD_MTIME ? ORDINARY_MTIME_MIN : ORDINARY_MTIME_MAX; - file_timestamp_sprintf (buf, ts); - error (NILF, _("%s: Timestamp out of range; substituting %s"), - fname ? fname : _("Current time"), 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. */ - -static void -print_file (const void *item) -{ - struct file *f = (struct file *) item; - struct dep *d; - struct dep *ood = 0; - - putchar ('\n'); - if (!f->is_target) - puts (_("# Not a target:")); - printf ("%s:%s", f->name, f->double_colon ? ":" : ""); - - /* Print all normal dependencies; note any order-only deps. */ - for (d = f->deps; d != 0; d = d->next) - if (! d->ignore_mtime) - printf (" %s", dep_name (d)); - else if (! ood) - ood = d; - - /* Print order-only deps, if we have any. */ - if (ood) - { - printf (" | %s", dep_name (ood)); - for (d = ood->next; d != 0; d = d->next) - if (d->ignore_mtime) - printf (" %s", dep_name (d)); - } - - putchar ('\n'); - - 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 or MAKEFILES makefile.")); - 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) - { - 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 (_("# Commands currently running (THIS IS A BUG).")); - break; - case cs_deps_running: - puts (_("# Dependencies commands running (THIS IS A BUG).")); - break; - case cs_not_started: - case cs_finished: - switch (f->update_status) - { - case -1: - break; - case 0: - puts (_("# Successfully updated.")); - break; - case 1: - assert (question_flag); - puts (_("# Needs to be updated (-q is set).")); - break; - case 2: - puts (_("# Failed to be updated.")); - break; - default: - puts (_("# Invalid value in `update_status' member!")); - fflush (stdout); - fflush (stderr); - abort (); - } - 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); -} - -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); -} - -#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]; - } - - bcopy (f->name, p, l); - p += l; - *(p++) = ' '; - } - *(p-1) = '\0'; - - last_targ_count = files.ht_fill; - } - - return value; -} - -void -init_hash_files (void) -{ - hash_init (&files, 1000, file_hash_1, file_hash_2, file_hash_cmp); -} - -/* EOF */ diff --git a/src/gmake/filedef.h b/src/gmake/filedef.h deleted file mode 100644 index b7d6e676..00000000 --- a/src/gmake/filedef.h +++ /dev/null @@ -1,199 +0,0 @@ -/* Definition of target file data structures for GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1997, -2002 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - - -/* 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 - { - char *name; - char *hname; /* Hashed filename */ - char *vpath; /* VPATH/vpath pathname */ - struct dep *deps; /* all dependencies, including duplicates */ - struct commands *cmds; /* Commands to execute for this target. */ - int command_flags; /* Flags OR'd in for cmds; see commands.h. */ - char *stem; /* Implicit stem, if an implicit - rule has been used */ - struct dep *also_make; /* Targets that are made by making this. */ - FILE_TIMESTAMP last_mtime; /* File's modtime, if already known. */ - FILE_TIMESTAMP mtime_before_update; /* File's modtime before any updating - has been performed. */ - struct file *prev; /* Previous entry for same file name; - used when there are multiple double-colon - entries for the same file. */ - - /* 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; - - short int update_status; /* Status of the last attempt to update, - or -1 if none has been made. */ - - enum /* State of the commands. */ - { /* Note: It is important that cs_not_started be zero. */ - cs_not_started, /* Not yet started. */ - cs_deps_running, /* Dep commands running. */ - cs_running, /* Commands running. */ - cs_finished /* Commands finished. */ - } command_state ENUM_BITFIELD (2); - - unsigned int precious:1; /* Non-0 means don't delete file on quit */ - 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 dependency of .PHONY. */ - unsigned int intermediate:1;/* Nonzero if this is an intermediate file. */ - /* Nonzero, for an intermediate file, - means remove_intermediates should not delete it. */ - unsigned int secondary:1; - 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 */ - }; - - -extern struct file *default_goal_file, *suffix_file, *default_file; - - -extern struct file *lookup_file PARAMS ((char *name)); -extern struct file *enter_file PARAMS ((char *name)); -extern void remove_intermediates PARAMS ((int sig)); -extern void snap_deps PARAMS ((void)); -extern void rename_file PARAMS ((struct file *file, char *name)); -extern void rehash_file PARAMS ((struct file *file, char *name)); -extern void set_command_state PARAMS ((struct file *file, int state)); -extern void notice_finished_file PARAMS ((struct file *file)); -extern void init_hash_files PARAMS ((void)); -extern char *build_target_list PARAMS ((char *old_list)); - -#if FILE_TIMESTAMP_HI_RES -# define FILE_TIMESTAMP_STAT_MODTIME(fname, st) \ - file_timestamp_cons (fname, (st).st_mtime, (st).st_mtim.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 19, - 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) - -extern FILE_TIMESTAMP file_timestamp_cons PARAMS ((char const *, - time_t, int)); -extern FILE_TIMESTAMP file_timestamp_now PARAMS ((int *)); -extern void file_timestamp_sprintf PARAMS ((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) -extern FILE_TIMESTAMP f_mtime PARAMS ((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. */ diff --git a/src/gmake/function.c b/src/gmake/function.c deleted file mode 100644 index 8100a8fc..00000000 --- a/src/gmake/function.c +++ /dev/null @@ -1,2023 +0,0 @@ -/* Builtin function expansion for GNU Make. -Copyright (C) 1988, 1989, 1991-1997, 1999, 2002 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.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 - { - const char *name; - unsigned char len; - unsigned char minimum_args; - unsigned char maximum_args; - char expand_args; - char *(*func_ptr) PARAMS ((char *output, char **argv, const char *fname)); - }; - -static unsigned long -function_table_entry_hash_1 (const void *keyv) -{ - struct function_table_entry const *key = (struct function_table_entry const *) keyv; - return_STRING_N_HASH_1 (key->name, key->len); -} - -static unsigned long -function_table_entry_hash_2 (const void *keyv) -{ - struct function_table_entry const *key = (struct function_table_entry const *) keyv; - return_STRING_N_HASH_2 (key->name, key->len); -} - -static int -function_table_entry_hash_cmp (const void *xv, const void *yv) -{ - struct function_table_entry const *x = (struct function_table_entry const *) xv; - struct function_table_entry const *y = (struct function_table_entry const *) 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. If SUFFIX_ONLY is nonzero, substitutions are - done only at the ends of whitespace-delimited words. */ - -char * -subst_expand (char *o, char *text, char *subst, char *replace, - unsigned int slen, unsigned int rlen, - int by_word, int suffix_only) -{ - char *t = text; - unsigned int tlen = strlen (text); - char *p; - - if (slen == 0 && !by_word && !suffix_only) - { - /* The first occurrence of "" in any string is its end. */ - o = variable_buffer_output (o, t, tlen); - if (rlen > 0) - o = variable_buffer_output (o, replace, rlen); - return o; - } - - do - { - if ((by_word | suffix_only) && 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 = sindex (t, tlen, subst, slen); - if (p == 0) - { - /* No more matches. Output everything left on the end. */ - o = variable_buffer_output (o, t, tlen); - 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 > t && !isblank ((unsigned char)p[-1])) - || (p[slen] != '\0' && !isblank ((unsigned char)p[slen])))) - || (suffix_only - && (p[slen] != '\0' && !isblank ((unsigned char)p[slen])))) - /* 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; adjust tlen. */ - { - char *nt = p + slen; - tlen -= nt - t; - t = nt; - } - } 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. */ - -char * -patsubst_expand (char *o, char *text, char *pattern, char *replace, - char *pattern_percent, char *replace_percent) -{ - unsigned int pattern_prepercent_len, pattern_postpercent_len; - unsigned int replace_prepercent_len, replace_postpercent_len = 0; - char *t; - unsigned int len; - int doneany = 0; - - /* We call find_percent on REPLACE before checking PATTERN so that REPLACE - will be collapsed before we call subst_expand if PATTERN has no %. */ - if (replace_percent == 0) - replace_percent = find_percent (replace); - if (replace_percent != 0) - { - /* Record the length of REPLACE before and after the % so - we don't have to compute these lengths more than once. */ - replace_prepercent_len = replace_percent - replace; - replace_postpercent_len = strlen (replace_percent + 1); - } - else - /* We store the length of the replacement - so we only need to compute it once. */ - replace_prepercent_len = strlen (replace); - - if (pattern_percent == 0) - pattern_percent = find_percent (pattern); - if (pattern_percent == 0) - /* With no % in the pattern, this is just a simple substitution. */ - return subst_expand (o, text, pattern, replace, - strlen (pattern), strlen (replace), 1, 0); - - /* 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; - pattern_postpercent_len = strlen (pattern_percent + 1); - - 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[-1] - || !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] - || t[len - pattern_postpercent_len] != pattern_percent[1] - || !strneq (&t[len - pattern_postpercent_len], - &pattern_percent[1], 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 + 1, - 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; -} - - -/* Look up a function by name. */ - -static const struct function_table_entry * -lookup_function (const char *s) -{ - const char *e = s; - - while (*e && ( (*e >= 'a' && *e <= 'z') || *e == '-')) - e++; - if (*e == '\0' || isblank ((unsigned char) *e)) - { - struct function_table_entry function_table_entry_key; - function_table_entry_key.name = s; - function_table_entry_key.len = e - s; - - return hash_find_item (&function_table, &function_table_entry_key); - } - return 0; -} - - -/* Return 1 if PATTERN matches STR, 0 if not. */ - -int -pattern_matches (char *pattern, char *percent, char *str) -{ - unsigned int sfxlen, strlength; - - if (percent == 0) - { - unsigned int len = strlen (pattern) + 1; - char *new_chars = (char *) alloca (len); - bcopy (pattern, new_chars, len); - pattern = new_chars; - percent = find_percent (pattern); - if (percent == 0) - return streq (pattern, str); - } - - 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; - register struct nameseq *chain; - register unsigned int idx; - - chain = multi_glob (parse_file_seq - (&line, '\0', sizeof (struct nameseq), - /* We do not want parse_file_seq to strip `./'s. - That would break examples like: - $(patsubst ./%.c,obj/%.o,$(wildcard ./?*.c)). */ - 0), - sizeof (struct nameseq)); - - if (result == 0) - { - length = 100; - result = (char *) xmalloc (100); - } - - idx = 0; - while (chain != 0) - { - register char *name = chain->name; - unsigned int len = strlen (name); - - struct nameseq *next = chain->next; - free ((char *) chain); - chain = next; - - /* multi_glob will pass names without globbing metacharacters - through as is, but we want only files that actually exist. */ - if (file_exists_p (name)) - { - if (idx + len + 1 > length) - { - length += (len + 1) * 2; - result = (char *) xrealloc (result, length); - } - bcopy (name, &result[idx], len); - idx += len; - result[idx++] = ' '; - } - - free (name); - } - - /* 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) -{ - o = patsubst_expand (o, argv[2], argv[0], argv[1], (char *) 0, (char *) 0); - return o; -} - - -static char * -func_join (char *o, char **argv, const char *funcname) -{ - 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. */ - register char *tp; - register char *pp; - char *list1_iterator = argv[0]; - 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) -{ - /* Expand the argument. */ - register 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; -} - -#ifdef VMS -# define IS_PATHSEP(c) ((c) == ']') -#else -# ifdef HAVE_DOS_PATHS -# define IS_PATHSEP(c) ((c) == '/' || (c) == '\\') -# else -# define IS_PATHSEP(c) ((c) == '/') -# endif -#endif - - -static char * -func_notdir_suffix (char *o, char **argv, const char *funcname) -{ - /* Expand the argument. */ - char *list_iterator = argv[0]; - char *p2 =0; - int doneany =0; - unsigned int len=0; - - int is_suffix = streq (funcname, "suffix"); - int is_notdir = !is_suffix; - while ((p2 = find_next_token (&list_iterator, &len)) != 0) - { - char *p = p2 + len; - - - while (p >= p2 && (!is_suffix || *p != '.')) - { - if (IS_PATHSEP (*p)) - break; - --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 (streq (funcname, "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) - { - o = variable_buffer_output (o, " ", 1); - doneany = 1; - } - } - if (doneany) - /* Kill last space. */ - --o; - - - return o; - -} - - -static char * -func_basename_dir (char *o, char **argv, const char *funcname) -{ - /* Expand the argument. */ - char *p3 = argv[0]; - char *p2=0; - int doneany=0; - unsigned int len=0; - char *p=0; - int is_basename= streq (funcname, "basename"); - int is_dir= !is_basename; - - while ((p2 = find_next_token (&p3, &len)) != 0) - { - p = p2 + len; - while (p >= p2 && (!is_basename || *p != '.')) - { - if (IS_PATHSEP (*p)) - break; - --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); - - o = variable_buffer_output (o, " ", 1); - doneany = 1; - } - if (doneany) - /* Kill last space. */ - --o; - - - return o; -} - -static char * -func_addsuffix_addprefix (char *o, char **argv, const char *funcname) -{ - int fixlen = strlen (argv[0]); - char *list_iterator = argv[1]; - int is_addprefix = streq (funcname, "addprefix"); - int is_addsuffix = !is_addprefix; - - int doneany = 0; - 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) -{ - o = subst_expand (o, argv[2], argv[0], argv[1], strlen (argv[0]), - strlen (argv[1]), 0, 0); - - return o; -} - - -static char * -func_firstword (char *o, char **argv, const char *funcname) -{ - unsigned int i; - char *words = argv[0]; /* Use a temp variable for find_next_token */ - char *p = find_next_token (&words, &i); - - if (p != 0) - o = variable_buffer_output (o, p, i); - - return o; -} - - -static char * -func_words (char *o, char **argv, const char *funcname) -{ - int i = 0; - char *word_iterator = argv[0]; - char buf[20]; - - while (find_next_token (&word_iterator, (unsigned int *) 0) != 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. - */ -static 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 *message) -{ - 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 make.h. */ - break; - - if (s <= end || end - beg < 0) - fatal (reading_file, "%s: '%s'", message, beg); -} - - - -static char * -func_word (char *o, char **argv, const char *funcname) -{ - char *end_p=0; - int i=0; - char *p=0; - - /* Check the first argument. */ - check_numeric (argv[0], _("non-numeric first argument to `word' function")); - i = atoi (argv[0]); - - if (i == 0) - fatal (reading_file, _("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) -{ - 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]); - count = atoi (argv[1]) - start + 1; - - if (count > 0) - { - char *p; - 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) -{ - /* Find the first occurrence of the first string in the second. */ - int i = strlen (argv[0]); - if (sindex (argv[1], 0, argv[0], i) != 0) - o = variable_buffer_output (o, argv[0], i); - - return o; -} - -static char * -func_foreach (char *o, char **argv, const char *funcname) -{ - /* expand only the first two. */ - char *varname = expand_argument (argv[0], NULL); - char *list = expand_argument (argv[1], NULL); - char *body = argv[2]; - - int doneany = 0; - char *list_iterator = list; - char *p; - unsigned int len; - register 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; - - { - char save = p[len]; - - p[len] = '\0'; - free (var->value); - var->value = (char *) xstrdup ((char*) p); - p[len] = save; - } - - 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; - int save_c; -}; - -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 = streq (funcname, "filter"); - char *pat_iterator = argv[0]; - 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. */ - - pattail = &pathead; - while ((p = find_next_token (&pat_iterator, &len)) != 0) - { - struct a_pattern *pat = (struct a_pattern *) alloca (sizeof (struct a_pattern)); - - *pattail = pat; - pattail = &pat->next; - - if (*pat_iterator != '\0') - ++pat_iterator; - - pat->str = p; - pat->length = len; - pat->save_c = p[len]; - p[len] = '\0'; - pat->percent = find_percent (p); - if (pat->percent == 0) - literals++; - } - *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 = (struct a_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 = (struct a_word *) 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; - } - - for (pp = pathead; pp != 0; pp = pp->next) - pp->str[pp->length] = pp->save_c; - - if (hashing) - hash_free (&a_word_table, 0); - - return o; -} - - -static char * -func_strip (char *o, char **argv, const char *funcname) -{ - char *p = argv[0]; - int doneany =0; - - while (*p != '\0') - { - int i=0; - char *word_start=0; - - 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 = (char *) alloca (len + 1); - - for (argvp=argv; argvp[1] != 0; ++argvp) - { - strcpy (p, *argvp); - p += strlen (*argvp); - *(p++) = ','; - *(p++) = ' '; - } - strcpy (p, *argvp); - - if (*funcname == 'e') - fatal (reading_file, "%s", msg); - - /* The warning function expands to the empty string. */ - error (reading_file, "%s", msg); - - return o; -} - - -/* - chop argv[0] into words, and sort them. - */ -static char * -func_sort (char *o, char **argv, const char *funcname) -{ - char **words = 0; - int nwords = 0; - register int wordi = 0; - - /* Chop ARGV[0] into words and put them in WORDS. */ - char *t = argv[0]; - char *p; - unsigned int len; - int i; - - while ((p = find_next_token (&t, &len)) != 0) - { - if (wordi >= nwords - 1) - { - nwords = (2 * nwords) + 5; - words = (char **) xrealloc ((char *) words, - nwords * sizeof (char *)); - } - words[wordi++] = savestring (p, len); - } - - if (!wordi) - return o; - - /* Now sort the list of words. */ - qsort ((char *) words, wordi, sizeof (char *), alpha_compare); - - /* Now write the sorted list. */ - 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); - } - free (words[i]); - } - /* 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) -{ - 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[0]) - { - char *expansion; - - expansion = expand_argument (argv[0], NULL); - - o = variable_buffer_output (o, expansion, strlen (expansion)); - - free (expansion); - } - - return o; -} - -static char * -func_wildcard (char *o, char **argv, const char *funcname) -{ - -#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) -{ - 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]); - - restore_variable_buffer (buf, len); - - return o; -} - - -static char * -func_value (char *o, char **argv, const char *funcname) -{ - /* 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? - */ -void -fold_newlines (char *buffer, int *length) -{ - 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; - } - } - *(++last_nonnl) = '\0'; - *length = last_nonnl - buffer; -} - - - -int shell_function_pid = 0, shell_function_completed; - - -#ifdef WINDOWS32 -/*untested*/ - -#include -#include -#include "sub_proc.h" - - -void -windows32_openpipe (int *pipedes, int *pid_p, char **command_argv, char **envp) -{ - SECURITY_ATTRIBUTES saAttr; - HANDLE hIn; - HANDLE hErr; - HANDLE hChildOutRd; - HANDLE hChildOutWr; - HANDLE hProcess; - - - saAttr.nLength = sizeof (SECURITY_ATTRIBUTES); - saAttr.bInheritHandle = TRUE; - saAttr.lpSecurityDescriptor = NULL; - - if (DuplicateHandle (GetCurrentProcess(), - GetStdHandle(STD_INPUT_HANDLE), - GetCurrentProcess(), - &hIn, - 0, - TRUE, - DUPLICATE_SAME_ACCESS) == FALSE) { - fatal (NILF, _("create_child_process: DuplicateHandle(In) failed (e=%d)\n"), - GetLastError()); - - } - if (DuplicateHandle(GetCurrentProcess(), - GetStdHandle(STD_ERROR_HANDLE), - GetCurrentProcess(), - &hErr, - 0, - TRUE, - DUPLICATE_SAME_ACCESS) == FALSE) { - fatal (NILF, _("create_child_process: DuplicateHandle(Err) failed (e=%d)\n"), - GetLastError()); - } - - if (!CreatePipe(&hChildOutRd, &hChildOutWr, &saAttr, 0)) - fatal (NILF, _("CreatePipe() failed (e=%d)\n"), GetLastError()); - - hProcess = process_init_fd(hIn, hChildOutWr, hErr); - - if (!hProcess) - fatal (NILF, _("windows32_openpipe (): process_init_fd() failed\n")); - - /* make sure that CreateProcess() has Path it needs */ - sync_Path_environment(); - - 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 = (int) hProcess; - - /* set up to read data from child */ - pipedes[0] = _open_osfhandle((long) hChildOutRd, O_RDONLY); - - /* this will be closed almost right away */ - pipedes[1] = _open_osfhandle((long) hChildOutWr, O_APPEND); - } else { - /* reap/cleanup the failed process */ - process_cleanup(hProcess); - - /* close handles which were duplicated, they weren't used */ - CloseHandle(hIn); - CloseHandle(hErr); - - /* close pipe handles, they won't be used */ - CloseHandle(hChildOutRd); - CloseHandle(hChildOutWr); - - /* set status for return */ - pipedes[0] = pipedes[1] = -1; - *pid_p = -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 ...) */ -#define func_shell 0 - -#else -#ifndef _AMIGA -static char * -func_shell (char *o, char **argv, const char *funcname) -{ - char* batch_filename = NULL; - int i; - -#ifdef __MSDOS__ - FILE *fpipe; -#endif - char **command_argv; - char *error_prefix; - char **envp; - int pipedes[2]; - int pid; - -#ifndef __MSDOS__ - /* Construct the argument list. */ - command_argv = construct_command_argv (argv[0], - (char **) NULL, (struct file *) 0, - &batch_filename); - if (command_argv == 0) - return o; -#endif - - /* Using a target environment for `shell' loses in cases like: - export var = $(shell echo foobie) - 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. */ - - envp = environ; - - /* For error messages. */ - if (reading_file != 0) - { - error_prefix = (char *) alloca (strlen (reading_file->filenm)+11+4); - sprintf (error_prefix, - "%s:%lu: ", reading_file->filenm, reading_file->lineno); - } - else - error_prefix = ""; - -#ifdef WINDOWS32 - - windows32_openpipe (pipedes, &pid, command_argv, envp); - - if (pipedes[0] < 0) { - /* open of the pipe failed, mark as failed execution */ - shell_function_completed = -1; - - return o; - } else - -#elif defined(__MSDOS__) - - fpipe = msdos_openpipe (pipedes, &pid, argv[0]); - if (pipedes[0] < 0) - { - perror_with_name (error_prefix, "pipe"); - return o; - } - -#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 (0, pipedes[1], command_argv, envp); - if (pid < 0) - perror_with_name (error_prefix, "spawn"); - -# else /* ! __EMX__ */ - - pid = vfork (); - if (pid < 0) - perror_with_name (error_prefix, "fork"); - else if (pid == 0) - child_execute_job (0, pipedes[1], command_argv, envp); - else - -# endif - -#endif - { - /* We are the parent. */ - - char *buffer; - unsigned int maxlen; - 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 ((char *) command_argv); - - /* Close the write side of the pipe. */ - (void) close (pipedes[1]); -#endif - - /* Set up and read from the pipe. */ - - maxlen = 200; - buffer = (char *) xmalloc (maxlen + 1); - - /* Read from the pipe until it gets EOF. */ - for (i = 0; ; i += cc) - { - if (i == maxlen) - { - maxlen += 512; - buffer = (char *) 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 most likely means that the execvp failed, - so we should just write out the error message - that came in over 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); - o = variable_buffer_output (o, buffer, i); - } - - free (buffer); - } - - return o; -} - -#else /* _AMIGA */ - -/* Do the Amiga version of func_shell. */ - -static char * -func_shell (char *o, char **argv, const char *funcname) -{ - /* 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; - int cc, i; - char * buffer, * ptr; - char ** aptr; - int len = 0; - char* batch_filename = NULL; - - /* Construct the argument list. */ - command_argv = construct_command_argv (argv[0], (char **) NULL, - (struct file *) 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 main.c:open_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 = (char *) 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); - o = variable_buffer_output (o, buffer, i); - free (buffer); - return o; -} -#endif /* _AMIGA */ -#endif /* !VMS */ - -#ifdef EXPERIMENTAL - -/* - equality. Return is string-boolean, ie, the empty string is false. - */ -static char * -func_eq (char* o, char **argv, char *funcname) -{ - 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) -{ - 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 - - -/* 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 PARAMS ((char *o, char **argv, const char *funcname)); - - -static struct function_table_entry function_table_init[] = -{ - /* Name/size */ /* MIN MAX EXP? Function */ - { STRING_SIZE_TUPLE("addprefix"), 2, 2, 1, func_addsuffix_addprefix}, - { STRING_SIZE_TUPLE("addsuffix"), 2, 2, 1, func_addsuffix_addprefix}, - { STRING_SIZE_TUPLE("basename"), 0, 1, 1, func_basename_dir}, - { STRING_SIZE_TUPLE("dir"), 0, 1, 1, func_basename_dir}, - { STRING_SIZE_TUPLE("notdir"), 0, 1, 1, func_notdir_suffix}, - { STRING_SIZE_TUPLE("subst"), 3, 3, 1, func_subst}, - { STRING_SIZE_TUPLE("suffix"), 0, 1, 1, func_notdir_suffix}, - { STRING_SIZE_TUPLE("filter"), 2, 2, 1, func_filter_filterout}, - { STRING_SIZE_TUPLE("filter-out"), 2, 2, 1, func_filter_filterout}, - { STRING_SIZE_TUPLE("findstring"), 2, 2, 1, func_findstring}, - { STRING_SIZE_TUPLE("firstword"), 0, 1, 1, func_firstword}, - { STRING_SIZE_TUPLE("join"), 2, 2, 1, func_join}, - { STRING_SIZE_TUPLE("patsubst"), 3, 3, 1, func_patsubst}, - { STRING_SIZE_TUPLE("shell"), 0, 1, 1, func_shell}, - { STRING_SIZE_TUPLE("sort"), 0, 1, 1, func_sort}, - { STRING_SIZE_TUPLE("strip"), 0, 1, 1, func_strip}, - { STRING_SIZE_TUPLE("wildcard"), 0, 1, 1, func_wildcard}, - { STRING_SIZE_TUPLE("word"), 2, 2, 1, func_word}, - { STRING_SIZE_TUPLE("wordlist"), 3, 3, 1, func_wordlist}, - { STRING_SIZE_TUPLE("words"), 0, 1, 1, func_words}, - { STRING_SIZE_TUPLE("origin"), 0, 1, 1, func_origin}, - { STRING_SIZE_TUPLE("foreach"), 3, 3, 0, func_foreach}, - { STRING_SIZE_TUPLE("call"), 1, 0, 1, func_call}, - { STRING_SIZE_TUPLE("error"), 0, 1, 1, func_error}, - { STRING_SIZE_TUPLE("warning"), 0, 1, 1, func_error}, - { STRING_SIZE_TUPLE("if"), 2, 3, 0, func_if}, - { STRING_SIZE_TUPLE("value"), 0, 1, 1, func_value}, - { STRING_SIZE_TUPLE("eval"), 0, 1, 1, func_eval}, -#ifdef EXPERIMENTAL - { STRING_SIZE_TUPLE("eq"), 2, 2, 1, func_eq}, - { STRING_SIZE_TUPLE("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) -{ - if (argc < (int)entry_p->minimum_args) - fatal (reading_file, - _("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 none do, so just test it for all functions here - rather than in each one. We can change it later if necessary. */ - - if (!argc) - return o; - - if (!entry_p->func_ptr) - fatal (reading_file, _("Unimplemented on this platform: function `%s'"), - entry_p->name); - - return entry_p->func_ptr (o, argv, entry_p->name); -} - -/* 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, char **stringp) -{ - const struct function_table_entry *entry_p; - char openparen = (*stringp)[0]; - char closeparen = openparen == '(' ? ')' : '}'; - char *beg; - char *end; - int count = 0; - register char *p; - 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 (reading_file, - _("unterminated call to function `%s': missing `%c'"), - entry_p->name, closeparen); - - *stringp = end; - - /* Get some memory to store the arg pointers. */ - argvp = argv = (char **) 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) - { - int len = end - beg; - - p = xmalloc (len+1); - memcpy (p, beg, len); - p[len] = '\0'; - beg = p; - end = beg + len; - } - - for (p=beg, nargs=0; p <= end; ++argvp) - { - char *next; - - ++nargs; - - if (nargs == entry_p->maximum_args - || (! (next = find_next_argument (openparen, closeparen, p, end)))) - next = end; - - if (entry_p->expand_args) - *argvp = expand_argument (p, next); - else - { - *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 (beg); - - 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) -{ - 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 (*fname != '\0' && 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 = (char *) 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 -hash_init_function_table (void) -{ - hash_init (&function_table, FUNCTION_TABLE_ENTRIES * 2, - function_table_entry_hash_1, function_table_entry_hash_2, - function_table_entry_hash_cmp); - hash_load (&function_table, function_table_init, - FUNCTION_TABLE_ENTRIES, sizeof (struct function_table_entry)); -} diff --git a/src/gmake/getloadavg.c b/src/gmake/getloadavg.c deleted file mode 100644 index c4d97460..00000000 --- a/src/gmake/getloadavg.c +++ /dev/null @@ -1,1030 +0,0 @@ -/* Get the system load averages. - Copyright (C) 1985, 86, 87, 88, 89, 91, 92, 93, 1994, 1995, 1997 - 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, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - USA. */ - -/* 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)) -# 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; - bzero ((char *) &stats, 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 "make.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/src/gmake/getopt.c b/src/gmake/getopt.c deleted file mode 100644 index 21c775c0..00000000 --- a/src/gmake/getopt.c +++ /dev/null @@ -1,1030 +0,0 @@ -/* Getopt for GNU. - NOTE: getopt is now part of the C library, so if you don't know what - "Keep this file name-space clean" means, talk to drepper@gnu.org - before changing it! - - Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98 - 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. - - 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, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - USA. */ - -/* 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/src/gmake/getopt.h b/src/gmake/getopt.h deleted file mode 100644 index fb30719a..00000000 --- a/src/gmake/getopt.h +++ /dev/null @@ -1,133 +0,0 @@ -/* Declarations for getopt. - Copyright (C) 1989,90,91,92,93,94,96,97 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. - - 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, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - USA. */ - -#ifndef _GETOPT_H -#define _GETOPT_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -/* For communication from `getopt' to the caller. - When `getopt' finds an option that takes an argument, - the argument value is returned here. - Also, when `ordering' is RETURN_IN_ORDER, - each non-option ARGV-element is returned here. */ - -extern char *optarg; - -/* Index in ARGV of the next element to be scanned. - This is used for communication to and from the caller - and for communication between successive calls to `getopt'. - - On entry to `getopt', zero means this is the first call; initialize. - - When `getopt' returns -1, this is the index of the first of the - non-option elements that the caller should itself scan. - - Otherwise, `optind' communicates from one call to the next - how much of ARGV has been scanned so far. */ - -extern int optind; - -/* Callers store zero here to inhibit the error message `getopt' prints - for unrecognized options. */ - -extern int opterr; - -/* Set to an option character which was unrecognized. */ - -extern int optopt; - -/* Describe the long-named options requested by the application. - The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector - of `struct option' terminated by an element containing a name which is - zero. - - The field `has_arg' is: - no_argument (or 0) if the option does not take an argument, - required_argument (or 1) if the option requires an argument, - optional_argument (or 2) if the option takes an optional argument. - - If the field `flag' is not NULL, it points to a variable that is set - to the value given in the field `val' when the option is found, but - left unchanged if the option is not found. - - To have a long-named option do something other than set an `int' to - a compiled-in constant, such as set a value from `optarg', set the - option's `flag' field to zero and its `val' field to a nonzero - value (the equivalent single-letter option character, if there is - one). For long options that have a zero `flag' field, `getopt' - returns the contents of the `val' field. */ - -struct option -{ -#if defined (__STDC__) && __STDC__ - const char *name; -#else - char *name; -#endif - /* has_arg can't be an enum because some compilers complain about - type mismatches in all the code that assumes it is an int. */ - int has_arg; - int *flag; - int val; -}; - -/* Names for the values of the `has_arg' field of `struct option'. */ - -#define no_argument 0 -#define required_argument 1 -#define optional_argument 2 - -#if defined (__STDC__) && __STDC__ -#ifdef __GNU_LIBRARY__ -/* Many other libraries have conflicting prototypes for getopt, with - differences in the consts, in stdlib.h. To avoid compilation - errors, only prototype getopt for the GNU C library. */ -extern int getopt (int argc, char *const *argv, const char *shortopts); -#else /* not __GNU_LIBRARY__ */ -extern int getopt (); -#endif /* __GNU_LIBRARY__ */ -extern int getopt_long (int argc, char *const *argv, const char *shortopts, - const struct option *longopts, int *longind); -extern int getopt_long_only (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind); - -/* Internal only. Users should not call this directly. */ -extern int _getopt_internal (int argc, char *const *argv, - const char *shortopts, - const struct option *longopts, int *longind, - int long_only); -#else /* not __STDC__ */ -extern int getopt (); -extern int getopt_long (); -extern int getopt_long_only (); - -extern int _getopt_internal (); -#endif /* __STDC__ */ - -#ifdef __cplusplus -} -#endif - -#endif /* getopt.h */ diff --git a/src/gmake/getopt1.c b/src/gmake/getopt1.c deleted file mode 100644 index f09a2839..00000000 --- a/src/gmake/getopt1.c +++ /dev/null @@ -1,180 +0,0 @@ -/* getopt_long and getopt_long_only entry points for GNU getopt. - Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98 - 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. - - 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, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - USA. */ - -#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/src/gmake/gettext.h b/src/gmake/gettext.h deleted file mode 100644 index ea67f308..00000000 --- a/src/gmake/gettext.h +++ /dev/null @@ -1,59 +0,0 @@ -/* Convenience header for conditional use of GNU . - Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. - - This program 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, 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 - Library General Public License for more details. - - You should have received a copy of the GNU Library 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. */ - -#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/src/gmake/glob/.cvsignore b/src/gmake/glob/.cvsignore deleted file mode 100644 index efc8094e..00000000 --- a/src/gmake/glob/.cvsignore +++ /dev/null @@ -1,2 +0,0 @@ -Makefile Makefile.in -.deps diff --git a/src/gmake/glob/COPYING.LIB b/src/gmake/glob/COPYING.LIB deleted file mode 100644 index bbe3fe19..00000000 --- a/src/gmake/glob/COPYING.LIB +++ /dev/null @@ -1,481 +0,0 @@ - GNU LIBRARY GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the library GPL. It is - numbered 2 because it goes with version 2 of the ordinary GPL.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Library General Public License, applies to some -specially designated Free Software Foundation software, and to any -other libraries whose authors decide to use it. You can use it for -your libraries, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if -you distribute copies of the library, or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link a program with the library, you must provide -complete object files to the recipients so that they can relink them -with the library, after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - Our method of protecting your rights has two steps: (1) copyright -the library, and (2) offer you this license which gives you legal -permission to copy, distribute and/or modify the library. - - Also, for each distributor's protection, we want to make certain -that everyone understands that there is no warranty for this free -library. If the library is modified by someone else and passed on, we -want its recipients to know that what they have is not the original -version, so that any problems introduced by others will not reflect on -the original authors' reputations. - - 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/src/gmake/glob/ChangeLog b/src/gmake/glob/ChangeLog deleted file mode 100644 index 75c68881..00000000 --- a/src/gmake/glob/ChangeLog +++ /dev/null @@ -1,142 +0,0 @@ -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. - diff --git a/src/gmake/glob/Makefile.am b/src/gmake/glob/Makefile.am deleted file mode 100644 index d38528da..00000000 --- a/src/gmake/glob/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -# -*-Makefile-*-, or close enough - -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/src/gmake/glob/Makefile.ami b/src/gmake/glob/Makefile.ami deleted file mode 100644 index d3e3d40c..00000000 --- a/src/gmake/glob/Makefile.ami +++ /dev/null @@ -1,69 +0,0 @@ -# Makefile for standalone distribution of libglob.a (fnmatch, glob). - -# Copyright (C) 1991, 92, 93, 94, 95, 97, 98 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., -# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# 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/src/gmake/glob/SCOPTIONS b/src/gmake/glob/SCOPTIONS deleted file mode 100644 index f89daae1..00000000 --- a/src/gmake/glob/SCOPTIONS +++ /dev/null @@ -1,13 +0,0 @@ -ERRORREXX -OPTIMIZE -NOVERSION -OPTIMIZERTIME -OPTIMIZERALIAS -DEFINE INCLUDEDIR="include:" -DEFINE LIBDIR="lib:" -DEFINE NO_ALLOCA -DEFINE NO_FLOAT -DEFINE NO_ARCHIVES -IGNORE=161 -IGNORE=100 -STARTUP=cres diff --git a/src/gmake/glob/SMakefile b/src/gmake/glob/SMakefile deleted file mode 100644 index 9dcb90b3..00000000 --- a/src/gmake/glob/SMakefile +++ /dev/null @@ -1,69 +0,0 @@ -# Makefile for standalone distribution of libglob.a (fnmatch, glob). - -# Copyright (C) 1991, 92, 93, 94, 95, 97, 98 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., -# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# 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/src/gmake/glob/configure.bat b/src/gmake/glob/configure.bat deleted file mode 100644 index d4c4383b..00000000 --- a/src/gmake/glob/configure.bat +++ /dev/null @@ -1,26 +0,0 @@ -@echo off -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/src/gmake/glob/fnmatch.c b/src/gmake/glob/fnmatch.c deleted file mode 100644 index 1f4ead5f..00000000 --- a/src/gmake/glob/fnmatch.c +++ /dev/null @@ -1,488 +0,0 @@ -/* Copyright (C) 1991, 92, 93, 96, 97, 98, 99 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, 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/src/gmake/glob/fnmatch.h b/src/gmake/glob/fnmatch.h deleted file mode 100644 index cc3ec379..00000000 --- a/src/gmake/glob/fnmatch.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright (C) 1991, 92, 93, 96, 97, 98, 99 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 the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -#ifndef _FNMATCH_H -#define _FNMATCH_H 1 - -#ifdef __cplusplus -extern "C" { -#endif - -#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. */ - -#ifndef const -# if (defined __STDC__ && __STDC__) || defined __cplusplus -# 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/src/gmake/glob/glob.c b/src/gmake/glob/glob.c deleted file mode 100644 index 4bbf7bb0..00000000 --- a/src/gmake/glob/glob.c +++ /dev/null @@ -1,1428 +0,0 @@ -/* Copyright (C) 1991,92,93,94,95,96,97,98,99 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., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, 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 - -#ifndef __GNU_LIBRARY__ -# ifdef __GNUC__ -__inline -# endif -# ifndef __SASC -# ifdef WINDOWS32 -static void * -# else -static char * -# endif -my_realloc (p, n) - char *p; - unsigned int n; -{ - /* 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__ */ - - -#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)); - -#ifdef VMS -/* these compilers like prototypes */ -#if !defined _LIBC || !defined NO_GLOB_PATTERN_P -int __glob_pattern_p (const char *pattern, int quote); -#endif -#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; - } - - 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 _AMIGA || defined VMS - | 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/src/gmake/glob/glob.h b/src/gmake/glob/glob.h deleted file mode 100644 index ca523f7a..00000000 --- a/src/gmake/glob/glob.h +++ /dev/null @@ -1,209 +0,0 @@ -/* Copyright (C) 1991, 92, 95, 96, 97, 98 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 the GNU C Library; see the file COPYING.LIB. If not, - write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, 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__ || !defined __P -# 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 aready 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/src/gmake/hash.c b/src/gmake/hash.c deleted file mode 100644 index 5eed69cc..00000000 --- a/src/gmake/hash.c +++ /dev/null @@ -1,333 +0,0 @@ -/* hash.c -- hash table maintenance - Copyright (C) 1995, 1999, 2002 Free Software Foundation, Inc. - Written by Greg McGary - - 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, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -*/ - -#include "make.h" -#include "hash.h" - -#define CALLOC(t, n) ((t *) calloc (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 %ld bytes for hash table: memory exhausted"), - ht->ht_size * sizeof(struct token *)); - exit (1); - } - - 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, void *item) -{ - void **slot = hash_find_slot (ht, item); - void *old_item = slot ? *slot : 0; - hash_insert_at (ht, item, slot); - return ((HASH_VACANT (old_item)) ? 0 : old_item); -} - -void * -hash_insert_at (struct hash_table *ht, void *item, const void *slot) -{ - 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/src/gmake/hash.h b/src/gmake/hash.h deleted file mode 100644 index 405f1dab..00000000 --- a/src/gmake/hash.h +++ /dev/null @@ -1,233 +0,0 @@ -/* hash.h -- decls for hash table - Copyright (C) 1995, 1999, 2002 Free Software Foundation, Inc. - Written by Greg McGary - - 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, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -#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; - 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 */ - 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 */ -}; - -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, void *item)); -void *hash_insert_at __P((struct hash_table *ht, 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. */ - -#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 = strcmp ((X), (Y)); \ -} while (0) -#define return_STRING_COMPARE(X, Y) do { \ - return 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 = strncmp ((X), (Y), (N)); \ -} while (0) -#define return_STRING_N_COMPARE(X, Y, N) do { \ - return 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 = strcmpi ((X), (Y)); \ -} while (0) -#define return_ISTRING_COMPARE(X, Y) do { \ - return strcmpi ((X), (Y)); \ -} while (0) - -#else - -#define ISTRING_HASH_1(KEY, RESULT) STRING_HASH_1 ((KEY), (RESULT)) -#define return_ISTRING_HASH_1(KEY) return_STRING_HASH_1 (KEY) - -#define ISTRING_HASH_2(KEY, RESULT) STRING_HASH_2 ((KEY), (RESULT)) -#define return_ISTRING_HASH_2(KEY) return_STRING_HASH_2 (KEY) - -#define ISTRING_COMPARE(X, Y, RESULT) STRING_COMPARE ((X), (Y), (RESULT)) -#define return_ISTRING_COMPARE(X, Y) return_STRING_COMPARE ((X), (Y)) - -#endif - -/* hash and comparison macros for integer _key_s. */ - -#define INTEGER_HASH_1(KEY, RESULT) do { \ - (RESULT) += ((unsigned long)(KEY)); \ -} while (0) -#define return_INTEGER_HASH_1(KEY) do { \ - unsigned long _result_ = 0; \ - INTEGER_HASH_1 ((KEY), _result_); \ - return _result_; \ -} while (0) - -#define INTEGER_HASH_2(KEY, RESULT) do { \ - (RESULT) += ~((unsigned long)(KEY)); \ -} while (0) -#define return_INTEGER_HASH_2(KEY) do { \ - unsigned long _result_ = 0; \ - INTEGER_HASH_2 ((KEY), _result_); \ - return _result_; \ -} while (0) - -#define INTEGER_COMPARE(X, Y, RESULT) do { \ - (RESULT) = X - Y; \ -} while (0) -#define return_INTEGER_COMPARE(X, Y) do { \ - int _result_; \ - INTEGER_COMPARE (X, Y, _result_); \ - return _result_; \ -} while (0) - -/* hash and comparison macros for address keys. */ - -#define ADDRESS_HASH_1(KEY, RESULT) INTEGER_HASH_1 (((unsigned long)(KEY)) >> 3, (RESULT)) -#define ADDRESS_HASH_2(KEY, RESULT) INTEGER_HASH_2 (((unsigned long)(KEY)) >> 3, (RESULT)) -#define ADDRESS_COMPARE(X, Y, RESULT) INTEGER_COMPARE ((X), (Y), (RESULT)) -#define return_ADDRESS_HASH_1(KEY) return_INTEGER_HASH_1 (((unsigned long)(KEY)) >> 3) -#define return_ADDRESS_HASH_2(KEY) return_INTEGER_HASH_2 (((unsigned long)(KEY)) >> 3) -#define return_ADDRESS_COMPARE(X, Y) return_INTEGER_COMPARE ((X), (Y)) - -#endif /* not _hash_h_ */ diff --git a/src/gmake/implicit.c b/src/gmake/implicit.c deleted file mode 100644 index 944d57a9..00000000 --- a/src/gmake/implicit.c +++ /dev/null @@ -1,630 +0,0 @@ -/* Implicit rule searching for GNU Make. -Copyright (C) 1988,89,90,91,92,93,94,97,2000 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" -#include "filedef.h" -#include "rule.h" -#include "dep.h" -#include "debug.h" - -static int pattern_search PARAMS ((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; -} - - -/* 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. */ - 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). */ - 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 *intermediate_file = 0; - - /* List of dependencies found recursively. */ - struct file **intermediate_files - = (struct file **) xmalloc (max_pattern_deps * sizeof (struct file *)); - - /* List of the patterns used to find intermediate files. */ - char **intermediate_patterns - = (char **) alloca (max_pattern_deps * sizeof (char *)); - - /* This buffer records all the dependencies actually found for a rule. */ - char **found_files = (char **) alloca (max_pattern_deps * sizeof (char *)); - /* Number of dep names now in FOUND_FILES. */ - unsigned int deps_found = 0; - - /* Names of possible dependencies are constructed in this buffer. */ - register char *depname = (char *) alloca (namelen + max_pattern_dep_length); - - /* The start and length of the stem of FILENAME for the current rule. */ - register char *stem = 0; - register unsigned int stemlen = 0; - register unsigned int fullstemlen = 0; - - /* Buffer in which we store all the rules that are possibly applicable. */ - struct rule **tryrules - = (struct rule **) xmalloc (num_pattern_rules * max_pattern_targets - * sizeof (struct rule *)); - - /* Number of valid elements in TRYRULES. */ - unsigned int nrules; - - /* The numbers of the rule targets of each rule - in TRYRULES that matched the target file. */ - unsigned int *matches - = (unsigned int *) alloca (num_pattern_rules * sizeof (unsigned int)); - - /* Each element is nonzero if LASTSLASH was used in - matching the corresponding element of TRYRULES. */ - char *checked_lastslash - = (char *) alloca (num_pattern_rules * sizeof (char)); - - /* 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 matched a pattern-rule target - that is not just `%'. */ - int specific_rule_matched = 0; - - register unsigned int i = 0; /* uninit checks OK */ - register struct rule *rule; - register struct dep *dep; - - char *p, *vp; - -#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; - } - - /* 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) - { - /* 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 (i = 0; rule->targets[i] != 0; ++i) - { - char *target = rule->targets[i]; - char *suffix = rule->suffixes[i]; - 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[i] > 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[i] + 1; - - /* Set CHECK_LASTSLASH if FILENAME contains a directory - prefix and the target pattern does not contain a slash. */ - -#ifdef VMS - check_lastslash = lastslash != 0 - && ((strchr (target, ']') == 0) - && (strchr (target, ':') == 0)); -#else - check_lastslash = lastslash != 0 && strchr (target, '/') == 0; -#endif - if (check_lastslash) - { - /* In that case, don't include the - directory prefix in STEM here. */ - unsigned int difference = lastslash - filename + 1; - if (difference > stemlen) - continue; - stemlen -= difference; - stem += difference; - } - - /* 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; - matches[nrules] = i; - checked_lastslash[nrules] = check_lastslash; - ++nrules; - } - } - - /* 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 (i = 0; i < nrules; ++i) - if (!tryrules[i]->terminal) - { - register unsigned int j; - for (j = 0; tryrules[i]->targets[j] != 0; ++j) - if (tryrules[i]->targets[j][1] == '\0') - break; - if (tryrules[i]->targets[j] != 0) - tryrules[i] = 0; - } - - /* Try each rule once without intermediate files, then once with them. */ - for (intermed_ok = 0; intermed_ok == !!intermed_ok; ++intermed_ok) - { - /* Try each pattern rule till we find one that applies. - If it does, copy the names of its dependencies (as substituted) - and store them in FOUND_FILES. DEPS_FOUND is the number of them. */ - - for (i = 0; i < nrules; i++) - { - int check_lastslash; - - rule = tryrules[i]; - - /* 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; - - /* Mark this rule as in use so a recursive - pattern_search won't try to use it. */ - rule->in_use = 1; - - /* From the lengths of the filename and the matching pattern parts, - find the stem: the part of the filename that matches the %. */ - stem = filename - + (rule->suffixes[matches[i]] - rule->targets[matches[i]]) - 1; - stemlen = namelen - rule->lens[matches[i]] + 1; - check_lastslash = checked_lastslash[i]; - if (check_lastslash) - { - stem += lastslash - filename + 1; - stemlen -= (lastslash - filename) + 1; - } - - DBS (DB_IMPLICIT, (_("Trying pattern rule with stem `%.*s'.\n"), - (int) stemlen, stem)); - - /* Try each dependency; see if it "exists". */ - - deps_found = 0; - for (dep = rule->deps; dep != 0; dep = dep->next) - { - /* If the dependency name has a %, substitute the stem. */ - p = strchr (dep_name (dep), '%'); - if (p != 0) - { - register unsigned int i; - if (check_lastslash) - { - /* Copy directory name from the original FILENAME. */ - i = lastslash - filename + 1; - bcopy (filename, depname, i); - } - else - i = 0; - bcopy (dep_name (dep), depname + i, p - dep_name (dep)); - i += p - dep_name (dep); - bcopy (stem, depname + i, stemlen); - i += stemlen; - strcpy (depname + i, p + 1); - p = depname; - } - else - p = dep_name (dep); - - /* P is now the actual dependency name as substituted. */ - - if (file_impossible_p (p)) - { - /* If this dependency has already been ruled - "impossible", then the rule fails and don't - bother trying it on the second pass either - since we know that will fail too. */ - DBS (DB_IMPLICIT, - (p == depname - ? _("Rejecting impossible implicit prerequisite `%s'.\n") - : _("Rejecting impossible rule prerequisite `%s'.\n"), - p)); - tryrules[i] = 0; - break; - } - - intermediate_files[deps_found] = 0; - - DBS (DB_IMPLICIT, - (p == depname - ? _("Trying implicit prerequisite `%s'.\n") - : _("Trying rule prerequisite `%s'.\n"), p)); - - /* 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. */ - - if (lookup_file (p) != 0 - || ((!dep->changed || check_lastslash) && file_exists_p (p))) - { - found_files[deps_found++] = xstrdup (p); - continue; - } - /* This code, given FILENAME = "lib/foo.o", dependency name - "lib/foo.c", and VPATH=src, searches for "src/lib/foo.c". */ - vp = p; - if (vpath_search (&vp, (FILE_TIMESTAMP *) 0)) - { - DBS (DB_IMPLICIT, - (_("Found prerequisite `%s' as VPATH `%s'\n"), p, vp)); - strcpy (vp, p); - found_files[deps_found++] = vp; - 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) - { - if (intermediate_file == 0) - intermediate_file - = (struct file *) alloca (sizeof (struct file)); - - DBS (DB_IMPLICIT, - (_("Looking for a rule with intermediate file `%s'.\n"), - p)); - - bzero ((char *) intermediate_file, sizeof (struct file)); - intermediate_file->name = p; - if (pattern_search (intermediate_file, 0, depth + 1, - recursions + 1)) - { - p = xstrdup (p); - intermediate_patterns[deps_found] - = intermediate_file->name; - intermediate_file->name = p; - intermediate_files[deps_found] = intermediate_file; - intermediate_file = 0; - /* Allocate an extra copy to go in FOUND_FILES, - because every elt of FOUND_FILES is consumed - or freed later. */ - found_files[deps_found] = xstrdup (p); - ++deps_found; - 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. */ - file_impossible (p); - } - - /* A dependency of this rule does not exist. - Therefore, this rule fails. */ - break; - } - - /* This rule is no longer `in use' for recursive searches. */ - rule->in_use = 0; - - if (dep != 0) - { - /* This pattern rule does not apply. - If some of its dependencies succeeded, - free the data structure describing them. */ - while (deps_found-- > 0) - { - register struct file *f = intermediate_files[deps_found]; - free (found_files[deps_found]); - if (f != 0 - && (f->stem < f->name - || f->stem > f->name + strlen (f->name))) - free (f->stem); - } - } - else - /* This pattern rule does apply. Stop looking for one. */ - break; - } - - /* If we found an applicable rule without - intermediate files, don't try with them. */ - if (i < nrules) - break; - - rule = 0; - } - - /* RULE is nil if the loop went all the way - through the list and everything failed. */ - if (rule == 0) - goto done; - - foundrule = i; - - /* 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[matches[foundrule]]; - - /* FOUND_FILES lists the dependencies for the rule we found. - This includes the intermediate files, if any. - Convert them into entries on the deps-chain of FILE. */ - - while (deps_found-- > 0) - { - register char *s; - - if (intermediate_files[deps_found] != 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 = intermediate_files[deps_found]; - register struct file *f = enter_file (imf->name); - f->deps = imf->deps; - f->cmds = imf->cmds; - f->stem = imf->stem; - f->also_make = imf->also_make; - imf = lookup_file (intermediate_patterns[deps_found]); - if (imf != 0 && imf->precious) - f->precious = 1; - f->intermediate = 1; - f->tried_implicit = 1; - for (dep = f->deps; dep != 0; dep = dep->next) - { - dep->file = enter_file (dep->name); - /* enter_file uses dep->name _if_ we created a new file. */ - if (dep->name != dep->file->name) - free (dep->name); - dep->name = 0; - dep->file->tried_implicit |= dep->changed; - } - } - - dep = (struct dep *) xmalloc (sizeof (struct dep)); - dep->ignore_mtime = 0; - s = found_files[deps_found]; - if (recursions == 0) - { - dep->name = 0; - dep->file = lookup_file (s); - if (dep->file == 0) - /* enter_file consumes S's storage. */ - dep->file = enter_file (s); - else - /* A copy of S is already allocated in DEP->file->name. - So we can free S. */ - free (s); - } - else - { - dep->name = s; - dep->file = 0; - dep->changed = 0; - } - if (intermediate_files[deps_found] == 0 && tryrules[foundrule]->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 (!checked_lastslash[foundrule]) - { - /* Always allocate new storage, since STEM might be - on the stack for an intermediate file. */ - file->stem = savestring (stem, stemlen); - fullstemlen = stemlen; - } - else - { - int dirlen = (lastslash + 1) - filename; - - /* We want to prepend the directory from - the original FILENAME onto the stem. */ - fullstemlen = dirlen + stemlen; - file->stem = (char *) xmalloc (fullstemlen + 1); - bcopy (filename, file->stem, dirlen); - bcopy (stem, file->stem + dirlen, stemlen); - file->stem[fullstemlen] = '\0'; - } - - file->cmds = rule->cmds; - - /* If this rule builds other targets, too, put the others into FILE's - `also_make' member. */ - - if (rule->targets[1] != 0) - for (i = 0; rule->targets[i] != 0; ++i) - if (i != matches[foundrule]) - { - struct dep *new = (struct dep *) xmalloc (sizeof (struct dep)); - /* GKM FIMXE: handle '|' here too */ - new->ignore_mtime = 0; - new->name = p = (char *) xmalloc (rule->lens[i] + fullstemlen + 1); - bcopy (rule->targets[i], p, - rule->suffixes[i] - rule->targets[i] - 1); - p += rule->suffixes[i] - rule->targets[i] - 1; - bcopy (file->stem, p, fullstemlen); - p += fullstemlen; - bcopy (rule->suffixes[i], p, - rule->lens[i] - (rule->suffixes[i] - rule->targets[i]) + 1); - new->file = enter_file (new->name); - new->next = file->also_make; - file->also_make = new; - } - - done: - free (intermediate_files); - free (tryrules); - - return rule != 0; -} diff --git a/src/gmake/job.c b/src/gmake/job.c deleted file mode 100644 index 755c814a..00000000 --- a/src/gmake/job.c +++ /dev/null @@ -1,3479 +0,0 @@ -/* Job execution and handling for GNU Make. -Copyright (C) 1988,89,90,91,92,93,94,95,96,97,99 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.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 - -char *default_shell = "sh.exe"; -int no_default_sh_exe = 1; -int batch_mode_shell = 1; - -#elif defined (_AMIGA) - -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). */ -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 -char default_shell[] = ""; -int batch_mode_shell = 0; - -#else - -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 -#endif - -#ifdef WINDOWS32 -# include -# include -# include -# include "sub_proc.h" -# include "w32err.h" -# include "pathstuff.h" -#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) -extern 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'. */ - -#ifdef VMS -static int vms_jobsefnmask = 0; -#endif /* !VMS */ - -#ifndef HAVE_UNISTD_H -extern int dup2 (); -extern int execve (); -extern void _exit (); -# ifndef VMS -extern int geteuid (); -extern int getegid (); -extern int setgid (); -extern int getgid (); -# endif -#endif - -extern char *allocated_variable_expand_for_file PARAMS ((char *line, struct file *file)); - -extern int getloadavg PARAMS ((double loadavg[], int nelem)); -extern int start_remote_job PARAMS ((char **argv, char **envp, int stdin_fd, - int *is_remote, int *id_ptr, int *used_stdin)); -extern int start_remote_job_p PARAMS ((int)); -extern int remote_status PARAMS ((int *exit_code_ptr, int *signal_ptr, - int *coredump_ptr, int block)); - -RETSIGTYPE child_handler PARAMS ((int)); -static void free_child PARAMS ((struct child *)); -static void start_job_command PARAMS ((struct child *child)); -static int load_too_high PARAMS ((void)); -static int job_next_command PARAMS ((struct child *)); -static int start_waiting_job PARAMS ((struct child *)); -#ifdef VMS -static void vmsWaitForChildren PARAMS ((int *)); -#endif - -/* 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; - - -#ifdef WINDOWS32 -/* - * The macro which references this function is defined in make.h. - */ -int -w32_kill(int pid, int sig) -{ - return ((process_kill(pid, sig) == TRUE) ? 0 : -1); -} -#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 (stricmp (name, known_os2shells[i]) == 0) /* strcasecmp() */ - return 0; /* not a unix shell */ - i++; - } - - /* in doubt assume a unix like shell */ - return 1; -} -#endif /* __EMX__ */ - - -/* 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 (char *target_name, int exit_code, int exit_sig, int coredump, - int ignored) -{ - if (ignored && silent_flag) - return; - -#ifdef VMS - if (!(exit_code & 1)) - error (NILF, - (ignored ? _("*** [%s] Error 0x%x (ignored)") - : _("*** [%s] Error 0x%x")), - target_name, exit_code); -#else - if (exit_sig == 0) - error (NILF, ignored ? _("[%s] Error %d (ignored)") : - _("*** [%s] Error %d"), - target_name, exit_code); - else - error (NILF, "*** [%s] %s%s", - target_name, strsignal (exit_sig), - coredump ? _(" (core dumped)") : ""); -#endif /* VMS */ -} - -#ifdef VMS -/* 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. */ - -char * -vms_redirect (struct dsc$descriptor_s *desc, char *fname, char *ibuf) -{ - char *fptr; - extern char *vmsify (); - - ibuf++; - while (isspace ((unsigned char)*ibuf)) - ibuf++; - fptr = ibuf; - while (*ibuf && !isspace ((unsigned char)*ibuf)) - 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")); - return ibuf; -} - - -/* - found apostrophe at (p-1) - - inc p until after closing apostrophe. */ - -static char * -handle_apos (char *p) -{ - int alast; - int inside; - -#define SEPCHARS ",/()= " - - inside = 0; - - while (*p != 0) - { - if (*p == '"') - { - if (inside) - { - while ((alast > 0) - && (*p == '"')) - { - p++; - alast--; - } - if (alast == 0) - inside = 0; - else - { - fprintf (stderr, _("Syntax error, still inside '\"'\n")); - exit (3); - } - } - else - { - p++; - if (strchr (SEPCHARS, *p)) - break; - inside = 1; - alast = 1; - while (*p == '"') - { - alast++; - p++; - } - } - } - else - p++; - } - - return p; -} - -#endif - - -/* 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; - -#ifndef __EMX__ /* Don't use SIGCHLD handler on OS/2. */ -RETSIGTYPE -child_handler (int sig) -{ - ++dead_children; - - if (job_rfd >= 0) - { - close (job_rfd); - job_rfd = -1; - } - - DB (DB_JOBS, (_("Got a SIGCHLD; %u unreaped children.\n"), dead_children)); -} -#endif /* !__EMX__ */ - -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) -{ - WAIT_T status; - /* 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; - register int pid; - int exit_code, exit_sig, coredump; - register struct child *lastc, *c; - int child_failed; - int any_remote, any_local; - - if (err && block) - { - /* We might block for a while, so let the user know why. */ - fflush (stdout); - error (NILF, _("*** Waiting for unfinished jobs....")); - } - - /* 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 0x%08lx (%s) PID %ld %s\n"), - (unsigned long int) c, c->file->name, - (long) 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 - 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); - -#ifdef __EMX__ - /* the SIGCHLD handler must not be used on OS/2 because, unlike - on UNIX systems, it had to call wait() itself. Therefore - job_rfd has to be closed here. */ - if (job_rfd >= 0) - { - close (job_rfd); - job_rfd = -1; - } -#endif - - } - 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; - int err; - - /* wait for anything to finish */ - if (hPID = process_wait_for_any()) { - - /* was an error found on this process? */ - err = process_last_err(hPID); - - /* get exit data */ - exit_code = process_exit_code(hPID); - - if (err) - 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; - } - pid = (int) 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->remote == remote && c->pid == pid) - 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 0x%08lx PID %ld %s\n") - : _("Reaping winning child 0x%08lx PID %ld %s\n"), - (unsigned long int) c, (long) c->pid, - c->remote ? _(" (remote)") : "")); - - if (c->sh_batch_file) { - DB (DB_JOBS, (_("Cleaning up temp batch file %s\n"), - c->sh_batch_file)); - - /* just try and remove, don't care if this fails */ - remove (c->sh_batch_file); - - /* 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; - - 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; - child_error (c->file->name, exit_code, exit_sig, coredump, 0); - c->file->update_status = 2; - 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->file->name, - 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 = 2; - } - else - { - /* 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 != 0) - /* 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 = 0; - } - - /* When we get here, all the commands for C->file are finished - (or aborted) and C->file->update_status contains 0 or 2. 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 0x%08lx PID %ld%s from chain.\n"), - (unsigned long int) c, (long) 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 && !keep_going_flag && - /* fatal_error_signal will die with the right signal. */ - !handling_fatal_signal) - die (2); - - /* Only block for one child. */ - block = 0; - } - - return; -} - -/* Free the storage allocated for CHILD. */ - -static void -free_child (struct child *child) -{ - /* If this child is the only one it was our "free" job, so don't put a - token back for it. This child has already been removed from the list, - so if there any left this wasn't the last one. */ - - if (job_fds[1] >= 0 && children) - { - 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 0x%08lx (%s).\n"), - (unsigned long int) child, child->file->name)); - } - - 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 ((char *) child->command_lines); - } - - if (child->environment != 0) - { - register char **ep = child->environment; - while (*ep != 0) - free (*ep++); - free ((char *) child->environment); - } - - free ((char *) 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 - -#ifdef MAKE_JOBSERVER -# ifdef __EMX__ -/* Never install the SIGCHLD handler for EMX!!! */ -# define set_child_handler_action_flags(x) -# else -/* Set the child handler action flags to FLAGS. */ -static void -set_child_handler_action_flags (int flags) -{ - struct sigaction sa; - bzero ((char *) &sa, sizeof sa); - sa.sa_handler = child_handler; - sa.sa_flags = flags; -#if defined SIGCHLD - sigaction (SIGCHLD, &sa, NULL); -#endif -#if defined SIGCLD && SIGCLD != SIGCHLD - sigaction (SIGCLD, &sa, NULL); -#endif -} -#endif /* !__EMX__ */ -#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) -{ -#ifndef _AMIGA - static int bad_stdin = -1; -#endif - register char *p; - int flags; -#ifdef VMS - char *argv; -#else - char **argv; -#endif - - /* If we have a completely empty commandset, stop now. */ - if (!child->command_ptr) - goto next_command; - - /* Combine the flags parsed for the line itself with - the flags specified globally for this target. */ - flags = (child->file->command_flags - | child->file->cmds->lines_flags[child->command_line - 1]); - - p = child->command_ptr; - child->noerror = flags & COMMANDS_NOERROR; - - 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; - - /* Figure out an argument list from this command line. */ - - { - char *end = 0; -#ifdef VMS - argv = p; -#else - argv = construct_command_argv (p, &end, child->file, &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 ((char *) argv); -#endif - child->file->update_status = 1; - 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 ((char *) 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 = 0; - notice_finished_file (child->file); - } - return; - } - - /* Print out the command. If silent, we call `message' with null so it - can log the working directory before the command's own error messages - appear. */ - - message (0, (just_print_flag || (!(flags & COMMANDS_SILENT) && !silent_flag)) - ? "%s" : (char *) 0, 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] && !strcmp (argv[0], "/bin/sh")) -#endif - && (argv[1] - && argv[1][0] == '-' && argv[1][1] == 'c' && argv[1][2] == '\0') - && (argv[2] && argv[2][0] == ':' && argv[2][1] == '\0') - && argv[3] == NULL) - { - free (argv[0]); - free ((char *) 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 ((char *) argv); -#endif - goto next_command; - } - - /* 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 ("vfork", ""); - goto error; - } - -#else - - parent_environ = environ; - -# 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 ? 0 : bad_stdin, 1, - 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 = vfork (); - 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); - - child_execute_job (child->good_stdin ? 0 : bad_stdin, 1, - argv, child->environment); - } - else if (child->pid < 0) - { - /* Fork failed! */ - unblock_sigs (); - perror_with_name ("vfork", ""); - 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(); - - hPID = process_easy(argv, child->environment); - - if (hPID != INVALID_HANDLE_VALUE) - child->pid = (int) hPID; - else { - int i; - unblock_sigs(); - fprintf(stderr, - _("process_easy() failed failed to launch process (e=%d)\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); - } - } -#endif /* WINDOWS32 */ -#endif /* __MSDOS__ or Amiga or WINDOWS32 */ - - /* 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 ((char *) argv); -#endif - - return; - - error: - child->file->update_status = 2; - notice_finished_file (child->file); - return; -} - -/* 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 ()) - { - /* 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 0x%08lx (%s) PID %ld%s on the chain.\n"), - (unsigned long int) c, c->file->name, - (long) 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 = 0; - /* 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) -{ - register struct commands *cmds = file->cmds; - register struct child *c; - char **lines; - register 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); - - /* Expand the command lines and store the results in LINES. */ - lines = (char **) 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). */ - bcopy (in, out, ref - in); - - /* Move both pointers past the boring stuff. */ - out += ref - in; - in = ref; - - if (*ref == '(' || *ref == '{') - { - char openparen = *ref; - char closeparen = openparen == '(' ? ')' : '}'; - int count; - char *p; - - *out++ = *in++; /* Copy OPENPAREN. */ - /* 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 > ref - && 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) - strcpy (out, in); - - /* Finally, expand the line. */ - lines[i] = allocated_variable_expand_for_file (cmds->command_lines[i], - file); - } - - /* Start the command sequence, record it in a new - `struct child', and add that to the chain. */ - - c = (struct child *) xmalloc (sizeof (struct child)); - bzero ((char *)c, sizeof (struct child)); - c->file = file; - c->command_lines = lines; - c->sh_batch_file = NULL; - - /* Fetch the first command line to be run. */ - job_next_command (c); - - /* Wait for a job slot to be freed up. If we allow an infinite number - don't bother; also job_slots will == 0 if we're using the jobserver. */ - - if (job_slots != 0) - while (job_slots_used == job_slots) - reap_children (1, 0); - -#ifdef MAKE_JOBSERVER - /* If we are controlling multiple jobs make sure we have a token before - starting the child. */ - - /* This can be inefficient. There's a decent chance that this job won't - actually have to run any subprocesses: the command script may be empty - or otherwise optimized away. It would be nice if we could defer - obtaining a token until just before we need it, in start_job_command. - To do that we'd need to keep track of whether we'd already obtained a - token (since start_job_command is called for each line of the job, not - just once). Also more thought needs to go into the entire algorithm; - this is where the old parallel job code waits, so... */ - - else if (job_fds[0] >= 0) - while (1) - { - char token; - int got_token; - int saved_errno; - - 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 (!children) - break; - - /* 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]); - } - - /* Reap anything that's currently waiting. */ - reap_children (0, 0); - - /* If our "free" token has become available, use it. */ - if (!children) - break; - - /* Set interruptible system calls, and read() for a job token. */ - set_child_handler_action_flags (0); - got_token = read (job_rfd, &token, 1); - saved_errno = errno; - set_child_handler_action_flags (SA_RESTART); - - /* If we got one, we're done here. */ - if (got_token == 1) - { - DB (DB_JOBS, (_("Obtained token for child 0x%08lx (%s).\n"), - (unsigned long int) c, c->file->name)); - break; - } - - /* 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 - - /* The job is now primed. Start it running. - (This will notice if there are in fact no commands.) */ - (void) 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); - - 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; -} - -static int -load_too_high (void) -{ -#if defined(__MSDOS__) || defined(VMS) || defined(_AMIGA) - return 1; -#else - double load; - - if (max_load_average < 0) - return 0; - - 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. */ - 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 (); - - DB (DB_JOBS, ("Current system load = %f (max requested = %f)\n", - load, max_load_average)); - return load >= 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 -#ifdef VMS -#include -#include - -/* This is called as an AST when a child process dies (it won't get - interrupted by anything except a higher level AST). -*/ -int vmsHandleChildTerm(struct child *child) -{ - int status; - register struct child *lastc, *c; - int child_failed; - - vms_jobsefnmask &= ~(1 << (child->efn - 32)); - - lib$free_ef(&child->efn); - - (void) sigblock (fatal_signal_mask); - - child_failed = !(child->cstatus & 1 || ((child->cstatus & 7) == 0)); - - /* 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->file->name, c->cstatus, 0, 0, 0); - c->file->update_status = 1; - delete_child_targets (c); - } - else - { - if (child_failed) - { - /* The commands failed, but we don't care. */ - child_error (c->file->name, 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 != 0) { - /* We failed to start the commands. */ - delete_child_targets (c); - } - break; - - default: - 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_FAILURE); - - (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 int pidToAbort= 0; -static int chan= 0; - -static void reEnableAst(void) { - lib$enable_ctrl (&oldCtrlMask,0); -} - -static astHandler (void) { - if (pidToAbort) { - sys$forcex (&pidToAbort, 0, SS$_ABORT); - pidToAbort= 0; - } - kill (getpid(),SIGQUIT); -} - -static void tryToSetupYAst(void) { - $DESCRIPTOR(inputDsc,"SYS$COMMAND"); - int status; - struct { - short int status, count; - int dvi; - } iosb; - - setupYAstTried++; - - if (!chan) { - status= sys$assign(&inputDsc,&chan,0,0); - if (!(status&SS$_NORMAL)) { - lib$signal(status); - return; - } - } - status= sys$qiow (0, chan, IO$_SETMODE|IO$M_CTRLYAST,&iosb,0,0, - astHandler,0,0,0,0,0); - if (status==SS$_ILLIOFUNC) { - sys$dassgn(chan); -#ifdef CTRLY_ENABLED_ANYWAY - fprintf (stderr, - _("-warning, CTRL-Y will leave sub-process(es) around.\n")); -#else - return; -#endif - } - if (status==SS$_NORMAL) - status= iosb.status; - if (!(status&SS$_NORMAL)) { - 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; - } -} -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_newline = 0; - - int spflags = CLI$M_NOWAIT; - int status; - char *cmd = alloca (strlen (argv) + 512), *p, *q; - char ifile[256], ofile[256], efile[256]; - char *comname = 0; - char procname[100]; - - /* Parse IO redirection. */ - - ifile[0] = 0; - ofile[0] = 0; - efile[0] = 0; - - 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; - - /* Handle comments and redirection. */ - for (p = argv, q = cmd; *p; p++, q++) - { - 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 '<': - p = vms_redirect (&ifiledsc, ifile, p); - *q = ' '; - have_redirection = 1; - break; - case '>': - have_redirection = 1; - if (*(p-1) == '2') - { - q--; - if (strncmp (p, ">&1", 3) == 0) - { - p += 3; - 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 - { - p = vms_redirect (&ofiledsc, ofile, p); - } - *q = ' '; - break; - case '\n': - have_newline = 1; - default: - *q = *p; - break; - } - } - *q = *p; - - 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) == 'r') - && (*(p+1) == 'm') - && ((*(p+2) == ' ') || (*(p+2) == '\t'))) - { - int in_arg; - - /* rm */ - p += 3; - while ((*p == ' ') || (*p == '\t')) - p++; - in_arg = 1; - - DB (DB_JOBS, (_("BUILTIN RM %s\n"), p)); - while (*p) - { - switch (*p) - { - case ' ': - case '\t': - if (in_arg) - { - *p++ = ';'; - in_arg = 0; - } - break; - default: - break; - } - p++; - } - } - else - { - printf(_("Unknown builtin command '%s'\n"), cmd); - fflush(stdout); - return 0; - } - } - - /* 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)) - { - FILE *outfile; - char c; - char *sep; - int alevel = 0; /* apostrophe level */ - - if (strlen (cmd) == 0) - { - printf (_("Error, empty command\n")); - fflush (stdout); - return 0; - } - - outfile = open_tmpfile (&comname, "sys$scratch:CMDXXXXXX.COM"); - if (outfile == 0) - pfatal_with_name (_("fopen (temporary file)")); - - 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]) - { - fprintf (outfile, "$ define sys$output %s\n", ofile); - DB (DB_JOBS, (_("Redirected output to %s\n"), ofile)); - ofiledsc.dsc$w_length = 0; - } - - p = sep = q = cmd; - for (c = '\n'; c; c = *q++) - { - switch (c) - { - case '\n': - /* At a newline, skip any whitespace around a leading $ - from the command and issue exactly one $ into the DCL. */ - while (isspace ((unsigned char)*p)) - p++; - if (*p == '$') - p++; - while (isspace ((unsigned char)*p)) - p++; - fwrite (p, 1, q - p, outfile); - fputc ('$', outfile); - fputc (' ', outfile); - /* Reset variables. */ - p = sep = q; - break; - - /* Nice places for line breaks are after strings, after - comma or space and before slash. */ - case '"': - q = handle_apos (q + 1); - 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); - } - } - - fwrite (p, 1, q - p, outfile); - fputc ('\n', outfile); - - fclose (outfile); - - sprintf (cmd, "$ @%s", 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)) - 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) - { - pidToAbort= child->pid; - status= sys$waitfr (child->efn); - pidToAbort= 0; - 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; - } - } - - if (comname && !ISDB (DB_JOBS)) - unlink (comname); - - return (status & 1); -} - -#else /* !VMS */ - -/* EMX: Start a child process. This function returns the new pid. */ -# if defined __MSDOS__ || defined __EMX__ -int -child_execute_job (int stdin_fd, int stdout_fd, char **argv, char **envp) -{ - int pid; - /* stdin_fd == 0 means: nothing to do for stdin; - stdout_fd == 1 means: nothing to do for stdout */ - int save_stdin = (stdin_fd != 0) ? dup (0) : 0; - int save_stdout = (stdout_fd != 1) ? dup (1): 1; - - /* < 0 only if dup() failed */ - if (save_stdin < 0) - fatal (NILF, _("no more file handles: could not duplicate stdin\n")); - if (save_stdout < 0) - fatal (NILF, _("no more file handles: could not duplicate stdout\n")); - - /* Close unnecessary file handles for the child. */ - if (save_stdin != 0) - CLOSE_ON_EXEC (save_stdin); - if (save_stdout != 1) - CLOSE_ON_EXEC (save_stdout); - - /* Connect the pipes to the child process. */ - if (stdin_fd != 0) - (void) dup2 (stdin_fd, 0); - if (stdout_fd != 1) - (void) dup2 (stdout_fd, 1); - - /* stdin_fd and stdout_fd must be closed on exit because we are - still in the parent process */ - if (stdin_fd != 0) - CLOSE_ON_EXEC (stdin_fd); - if (stdout_fd != 1) - CLOSE_ON_EXEC (stdout_fd); - - /* Run the command. */ - pid = exec_command (argv, envp); - - /* Restore stdout/stdin of the parent process. */ - if (stdin_fd != 0 && dup2 (save_stdin, 0) != 0) - fatal (NILF, _("restoring of stdin failed\n")); - if (stdout_fd != 1 && dup2 (save_stdout, 1) != 1) - fatal (NILF, _("restoring of stdout failed\n")); - - return pid; -} - -#elif !defined (_AMIGA) && !defined (__MSDOS__) - -/* UNIX: - Replace the current process with one executing the command in ARGV. - STDIN_FD and STDOUT_FD are used as the process's stdin and stdout; ENVP is - the environment of the new program. This function does not return. */ -void -child_execute_job (int stdin_fd, int stdout_fd, char **argv, char **envp) -{ - if (stdin_fd != 0) - (void) dup2 (stdin_fd, 0); - if (stdout_fd != 1) - (void) dup2 (stdout_fd, 1); - if (stdin_fd != 0) - (void) close (stdin_fd); - if (stdout_fd != 1) - (void) close (stdout_fd); - - /* Run the command. */ - exec_command (argv, envp); -} -#endif /* !AMIGA && !__MSDOS__ */ -#endif /* !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 err = 0; - int exit_code = EXIT_FAILURE; - - /* make sure CreateProcess() has Path it needs */ - sync_Path_environment(); - - /* launch command */ - hPID = process_easy(argv, envp); - - /* make sure launch ok */ - if (hPID == INVALID_HANDLE_VALUE) - { - int i; - fprintf(stderr, - _("process_easy() failed failed to launch process (e=%d)\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 */ - while (hWaitPID = process_wait_for_any()) - { - /* was an error found on this process? */ - 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 - fprintf(stderr, - _("make reaped child pid %d, still waiting for pid %d\n"), - hWaitPID, hPID); - } - - /* 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: - 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 (); - char *shell; - char **new_argv; - int argc; - -# 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; - - new_argv = (char **) alloca ((1 + argc + 1) * sizeof (char *)); - new_argv[0] = shell; - new_argv[1] = argv[0]; - while (argc > 0) - { - new_argv[1 + 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) - 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 :-( */ - 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). */ - -static char ** -construct_command_argv_internal (char *line, char **restp, char *shell, - char *ifs, char **batch_filename_ptr) -{ -#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 char sh_chars_dos[] = "*?[];|<>%^&()"; - static 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 char sh_chars_sh[] = "#;\"*?[]&|<>(){}$`^"; - static 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", - 0 }; - - char *sh_chars; - char **sh_cmds; -#elif defined (__EMX__) - static char sh_chars_dos[] = "*?[];|<>%^&()"; - static 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 char sh_chars_os2[] = "*?[];|<>%^()\"'&"; - static 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 char sh_chars_sh[] = "#;\"*?[]&|<>(){}$`^~'"; - static 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 }; - char *sh_chars; - char **sh_cmds; - -#elif defined (_AMIGA) - static char sh_chars[] = "#;\"|<>()?*$`"; - static 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) - static char sh_chars_dos[] = "\"|&<>"; - static char *sh_cmds_dos[] = { "break", "call", "cd", "chcp", "chdir", "cls", - "copy", "ctty", "date", "del", "dir", "echo", - "erase", "exit", "for", "goto", "if", "if", "md", - "mkdir", "path", "pause", "prompt", "rd", "rem", - "ren", "rename", "rmdir", "set", "shift", "time", - "type", "ver", "verify", "vol", ":", 0 }; - static char sh_chars_sh[] = "#;\"*?[]&|<>(){}$`^"; - static 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 }; - char* sh_chars; - char** sh_cmds; -#else /* must be UNIX-ish */ - static char sh_chars[] = "#;\"*?[]&|<>(){}$`^~"; - static char *sh_cmds[] = { "cd", "eval", "exec", "exit", "login", - "logout", "set", "umask", "wait", "while", "for", - "case", "if", ":", ".", "break", "continue", - "export", "read", "readonly", "shift", "times", - "trap", "switch", 0 }; -#endif /* __MSDOS__ */ - register int i; - register char *p; - register char *ap; - char *end; - int instring, word_has_equals, seen_nonequals, last_argument_was_empty; - char **new_argv = 0; -#ifdef WINDOWS32 - int slow_flag = 0; - - if (no_default_sh_exe) { - 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; - - /* 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 : "")); - - if (s1) - free (s1); - if (s2) - free (s2); - } - if (slow_flag) - goto slow; -#else /* not WINDOWS32 */ -#if defined (__MSDOS__) || defined (__EMX__) - else if (stricmp (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 != 0) - for (ap = ifs; *ap != '\0'; ++ap) - if (*ap != ' ' && *ap != '\t' && *ap != '\n') - goto slow; - - i = strlen (line) + 1; - - /* More than 1 arg per character is impossible. */ - new_argv = (char **) xmalloc (i * sizeof (char *)); - - /* All the args can fit in a buffer as big as LINE is. */ - ap = new_argv[0] = (char *) xmalloc (i); - end = ap + i; - - /* 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) - { - if (ap > end) - abort (); - - if (instring) - { - string_char: - /* 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') - goto swallow_escaped_newline; - 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; - else - *ap++ = *p; - } - else if (strchr (sh_chars, *p) != 0) - /* Not inside a string, but it's a special char. */ - 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 combinations are eaten. */ - if (p[1] == '\n') - { - swallow_escaped_newline: - - /* Eat the backslash, the newline, and following whitespace, - replacing it all with a single space. */ - p += 2; - - /* If there is a tab after a backslash-newline, - remove it from the source line which will be echoed, - since it was most likely used to line - up the continued line with the previous one. */ - if (*p == '\t') - /* Note these overlap and strcpy() is undefined for - overlapping objects in ANSI C. The strlen() _IS_ right, - since we need to copy the nul byte too. */ - bcopy (p + 1, p, strlen (p)); - - if (instring) - goto string_char; - else - { - if (ap != new_argv[i]) - /* Treat this as a space, ending the arg. - But if it's at the beginning of the arg, it should - just get eaten, rather than becoming an empty arg. */ - goto end_of_arg; - else - p = next_token (p) - 1; - } - } - 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': - end_of_arg: - /* 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; - } - - /* Ignore multiple whitespace chars. */ - p = next_token (p); - /* Next iteration should examine the first nonwhite char. */ - --p; - break; - - default: - *ap++ = *p; - break; - } - } - end_of_line: - - if (instring) - /* Let the shell deal with an unterminated quote. */ - goto slow; - - /* Terminate the last argument and the argument list. */ - - *ap = '\0'; - if (new_argv[i][0] != '\0' || last_argument_was_empty) - ++i; - new_argv[i] = 0; - - if (i == 1) - { - register int j; - for (j = 0; sh_cmds[j] != 0; ++j) - if (streq (sh_cmds[j], new_argv[0])) - goto slow; - } - - if (new_argv[0] == 0) - /* Line was empty. */ - return 0; - else - return new_argv; - - slow:; - /* We must use the shell. */ - - if (new_argv != 0) - { - /* Free the old argument list we were working on. */ - free (new_argv[0]); - free ((void *)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 = (char *)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 = (char **) 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 -c LINE", with all special chars in LINE escaped. - Then recurse, expanding this command line to get the final - argument list. */ - - unsigned int shell_len = strlen (shell); -#ifndef VMS - static char minus_c[] = " -c "; -#else - static char minus_c[] = ""; -#endif - unsigned int line_len = strlen (line); - - char *new_line = (char *) alloca (shell_len + (sizeof (minus_c) - 1) - + (line_len * 2) + 1); - char *command_ptr = NULL; /* used for batch_mode_shell mode */ - -# ifdef __EMX__ /* is this necessary? */ - if (!unixy_shell) - minus_c[1] = '/'; /* " /c " */ -# endif - - ap = new_line; - bcopy (shell, ap, shell_len); - ap += shell_len; - bcopy (minus_c, ap, sizeof (minus_c) - 1); - ap += sizeof (minus_c) - 1; - command_ptr = ap; - for (p = line; *p != '\0'; ++p) - { - if (restp != NULL && *p == '\n') - { - *restp = p; - break; - } - else if (*p == '\\' && p[1] == '\n') - { - /* Eat the backslash, the newline, and following whitespace, - replacing it all with a single space (which is escaped - from the shell). */ - p += 2; - - /* If there is a tab after a backslash-newline, - remove it from the source line which will be echoed, - since it was most likely used to line - up the continued line with the previous one. */ - if (*p == '\t') - bcopy (p + 1, p, strlen (p)); - - p = next_token (p); - --p; - if (unixy_shell && !batch_mode_shell) - *ap++ = '\\'; - *ap++ = ' '; - 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 + sizeof (minus_c) - 1) - /* Line was empty. */ - 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 ((no_default_sh_exe || batch_mode_shell) && batch_filename_ptr) { - FILE* batch = NULL; - int id = GetCurrentProcessId(); - PATH_VAR(fbuf); - char* fname = NULL; - - /* create a file name */ - sprintf(fbuf, "make%d", id); - fname = tempnam(".", fbuf); - - /* create batch file name */ - *batch_filename_ptr = xmalloc(strlen(fname) + 5); - strcpy(*batch_filename_ptr, fname); - - /* make sure path name is in DOS backslash format */ - if (!unixy_shell) { - fname = *batch_filename_ptr; - for (i = 0; fname[i] != '\0'; ++i) - if (fname[i] == '/') - fname[i] = '\\'; - strcat(*batch_filename_ptr, ".bat"); - } else { - strcat(*batch_filename_ptr, ".sh"); - } - - DB (DB_JOBS, (_("Creating temporary batch file %s\n"), - *batch_filename_ptr)); - - /* create batch file to execute command */ - batch = fopen (*batch_filename_ptr, "w"); - if (!unixy_shell) - fputs ("@echo off\n", batch); - fputs (command_ptr, batch); - fputc ('\n', batch); - fclose (batch); - - /* create argv */ - new_argv = (char **) xmalloc(3 * sizeof (char *)); - if (unixy_shell) { - new_argv[0] = xstrdup (shell); - new_argv[1] = *batch_filename_ptr; /* only argv[0] gets freed later */ - } else { - new_argv[0] = xstrdup (*batch_filename_ptr); - new_argv[1] = NULL; - } - new_argv[2] = NULL; - } else -#endif /* WINDOWS32 */ - if (unixy_shell) - new_argv = construct_command_argv_internal (new_line, (char **) NULL, - (char *) 0, (char *) 0, - (char **) 0); -# ifdef __EMX__ - else if (!unixy_shell) - { - /* new_line is local, must not be freed therefore */ - char *p, *q; - int quote; - size_t index; - size_t len; - - /* handle quotes - We have to remove all double quotes and to split the line - into distinct arguments because of the strange handling - of builtin commands by cmd: 'echo "bla"' prints "bla" - (with quotes) while 'c:\bin\echo.exe "bla"' prints bla - (without quotes). Some programs like autoconf rely - on the second behaviour. */ - - len = strlen (new_line) + 1; - - /* More than 1 arg per character is impossible. */ - new_argv = (char **) xmalloc (len * sizeof (char *)); - - /* All the args can fit in a buffer as big as new_line is. */ - new_argv[0] = (char *) xmalloc (len); - - index = 0; - quote = 0; - q = new_line; - p = new_argv[index]; - while(*q != '\0') - { - /* searching for closing quote */ - if (quote) - { - if (*q == quote) - { - /* remove the quote */ - q++; - quote = 0; - } - else /* normal character: copy it */ - *p++ = *q++; - } - - /* searching for opening quote */ - else if (*q == '\"' -# ifndef NO_CMD_DEFAULT - || *q == '\'' -# endif - ) - { - /* remove opening quote */ - quote = *q; - q++; - } - - /* spaces outside of a quoted string: remove them - and start a new argument */ - else if (*q == ' ' || *q == '\t') - { - *p++ = '\0'; /* trailing '\0' for last argument */ - - /* remove all successive spaces */ - do - { - q++; - } - while(*q == ' ' || *q == '\t'); - - /* start new argument */ - index++; - new_argv[index] = p; - } - - /* normal character (no space) outside a quoted string*/ - else - *p++ = *q++; - } /* end while() */ - - *p = '\0'; /* trailing '\0' for the last argument */ - new_argv[index + 1] = NULL; - -# ifndef NO_CMD_DEFAULT - /* special case: echo x="y" - (e.g. autoconf uses this to determine whether make works) - this is pure idioty but cmd works this way: - if 'echo' and 'x="y"' are two different arguments cmd - will print '"x="y""' but if they are only one argument - cmd will print 'bla="blurb"' as it should be - note: if we do not allow cmd to be the default shell - we do not need this kind of voodoo */ - if (index == 3 && strcasecmp(new_argv[2], "echo") == 0) - { - new_argv[2][4] = ' '; - new_argv[3] = NULL; - } -# endif - } -#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 = (char **) xmalloc (sizeof (char *)); - line_len = strlen (new_line) - shell_len - sizeof (minus_c) + 1; - new_argv[0] = xmalloc (line_len + 1); - strncpy (new_argv[0], - new_line + shell_len + sizeof (minus_c) - 1, line_len); - new_argv[0][line_len] = '\0'; - } -#else - else - fatal (NILF, _("%s (line %d) Bad shell context (!unixy && !batch_mode_shell)\n"), - __FILE__, __LINE__); -#endif - } -#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, - char **batch_filename_ptr) -{ - char *shell, *ifs; - 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 = (char **)malloc (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__ */ - - ifs = allocated_variable_expand_for_file ("$(IFS)", file); - - warn_undefined_variables_flag = save; - } - - argv = construct_command_argv_internal (line, restp, shell, ifs, batch_filename_ptr); - - free (shell); - 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 /* !HAPE_DUP2 && !_AMIGA */ diff --git a/src/gmake/job.h b/src/gmake/job.h deleted file mode 100644 index 85176ea8..00000000 --- a/src/gmake/job.h +++ /dev/null @@ -1,104 +0,0 @@ -/* Definitions for managing subprocesses in GNU Make. -Copyright (C) 1992, 1993, 1996, 1999 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#ifndef SEEN_JOB_H -#define SEEN_JOB_H - -#ifdef HAVE_FCNTL_H -# include -#else -# include -#endif - -/* How to set close-on-exec for a file descriptor. */ - -#if !defined F_SETFD -# define CLOSE_ON_EXEC(_d) -#else -# ifndef FD_CLOEXEC -# define FD_CLOEXEC 1 -# endif -# define CLOSE_ON_EXEC(_d) (void) fcntl ((_d), F_SETFD, FD_CLOEXEC) -#endif - -/* 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 **command_lines; /* Array of variable-expanded cmd lines. */ - unsigned int command_line; /* Index into above. */ - char *command_ptr; /* Ptr into command_lines[command_line]. */ - - pid_t pid; /* Child process's ID number. */ -#ifdef VMS - int efn; /* Completion event flag number */ - int cstatus; /* Completion status */ -#endif - char *sh_batch_file; /* Script file for shell commands */ - 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. */ - }; - -extern struct child *children; - -extern void new_job PARAMS ((struct file *file)); -extern void reap_children PARAMS ((int block, int err)); -extern void start_waiting_jobs PARAMS ((void)); - -extern char **construct_command_argv PARAMS ((char *line, char **restp, struct file *file, char** batch_file)); -#ifdef VMS -extern int child_execute_job PARAMS ((char *argv, struct child *child)); -#elif defined(__EMX__) -extern int child_execute_job PARAMS ((int stdin_fd, int stdout_fd, char **argv, char **envp)); -#else -extern void child_execute_job PARAMS ((int stdin_fd, int stdout_fd, char **argv, char **envp)); -#endif -#ifdef _AMIGA -extern void exec_command PARAMS ((char **argv)); -#elif defined(__EMX__) -extern int exec_command PARAMS ((char **argv, char **envp)); -#else -extern void exec_command PARAMS ((char **argv, char **envp)); -#endif - -extern unsigned int job_slots_used; - -extern void block_sigs PARAMS ((void)); -#ifdef POSIX -extern void unblock_sigs PARAMS ((void)); -#else -#ifdef HAVE_SIGSETMASK -extern int fatal_signal_mask; -#define unblock_sigs() sigsetmask (0) -#else -#define unblock_sigs() -#endif -#endif - -#endif /* SEEN_JOB_H */ diff --git a/src/gmake/main.c b/src/gmake/main.c deleted file mode 100644 index 7af539d3..00000000 --- a/src/gmake/main.c +++ /dev/null @@ -1,2835 +0,0 @@ -/* Argument parsing and main program of GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1994, 1995, 1996, 1997, 1998, 1999, -2002, 2003 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#include "make.h" -#include "dep.h" -#include "filedef.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 "pathstuff.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 - -extern void init_dir PARAMS ((void)); -extern void remote_setup PARAMS ((void)); -extern void remote_cleanup PARAMS ((void)); -extern RETSIGTYPE fatal_error_signal PARAMS ((int sig)); - -extern void print_variable_data_base PARAMS ((void)); -extern void print_dir_data_base PARAMS ((void)); -extern void print_rule_data_base PARAMS ((void)); -extern void print_file_data_base PARAMS ((void)); -extern void print_vpath_data_base PARAMS ((void)); - -#if defined HAVE_WAITPID || defined HAVE_WAIT3 -# define HAVE_WAIT_NOHANG -#endif - -#ifndef HAVE_UNISTD_H -extern int chdir (); -#endif -#ifndef STDC_HEADERS -# ifndef sun /* Sun has an incorrect decl in a header. */ -extern void exit PARAMS ((int)) __attribute__ ((noreturn)); -# endif -extern double atof (); -#endif - -static void print_data_base PARAMS ((void)); -static void print_version PARAMS ((void)); -static void decode_switches PARAMS ((int argc, char **argv, int env)); -static void decode_env_switches PARAMS ((char *envar, unsigned int len)); -static void define_makeflags PARAMS ((int all, int makefile)); -static char *quote_for_env PARAMS ((char *out, char *in)); -static void initialize_global_hash_tables PARAMS ((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 switch. */ - positive_int, /* A positive integer. */ - floating, /* A floating-point number (double). */ - ignore /* Ignored. */ - } type; - - char *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. */ - - char *noarg_value; /* Pointer to value used if no argument is given. */ - char *default_value;/* Pointer to default value. */ - - 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 string arguments. */ - -struct stringlist - { - 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 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; -static int debug_flag = 0; - -int db_level = 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 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; - -/* Number of job slots (commands that can be run at once). */ - -unsigned int job_slots = 1; -unsigned int default_job_slots = 1; - -/* Value of job_slots that means no limit. */ - -static unsigned int inf_jobs = 0; - -/* File descriptors for the jobs pipe. */ - -static struct stringlist *jobserver_fds = 0; - -int job_fds[2] = { -1, -1 }; -int job_rfd = -1; - -/* 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; - -/* 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. */ - -int always_make_flag = 0; - -/* 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_("\ - -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 commands.\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_("\ - -n, --just-print, --dry-run, --recon\n\ - Don't actually run any commands; 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_("\ - -p, --print-data-base Print make's internal database.\n"), - N_("\ - -q, --question Run no commands; 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 commands.\n"), - N_("\ - -S, --no-keep-going, --stop\n\ - Turns off -k.\n"), - N_("\ - -t, --touch Touch targets instead of remaking them.\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. */ - -static const struct command_switch switches[] = - { - { 'b', ignore, 0, 0, 0, 0, 0, 0, 0 }, - { 'B', flag, (char *) &always_make_flag, 1, 1, 0, 0, 0, "always-make" }, - { 'C', string, (char *) &directories, 0, 0, 0, 0, 0, "directory" }, - { 'd', flag, (char *) &debug_flag, 1, 1, 0, 0, 0, 0 }, - { CHAR_MAX+1, string, (char *) &db_flags, 1, 1, 0, "basic", 0, "debug" }, -#ifdef WINDOWS32 - { 'D', flag, (char *) &suspend_flag, 1, 1, 0, 0, 0, "suspend-for-debug" }, -#endif - { 'e', flag, (char *) &env_overrides, 1, 1, 0, 0, 0, - "environment-overrides", }, - { 'f', string, (char *) &makefiles, 0, 0, 0, 0, 0, "file" }, - { 'h', flag, (char *) &print_usage_flag, 0, 0, 0, 0, 0, "help" }, - { 'i', flag, (char *) &ignore_errors_flag, 1, 1, 0, 0, 0, - "ignore-errors" }, - { 'I', string, (char *) &include_directories, 1, 1, 0, 0, 0, - "include-dir" }, - { 'j', positive_int, (char *) &job_slots, 1, 1, 0, (char *) &inf_jobs, - (char *) &default_job_slots, "jobs" }, - { CHAR_MAX+2, string, (char *) &jobserver_fds, 1, 1, 0, 0, 0, - "jobserver-fds" }, - { 'k', flag, (char *) &keep_going_flag, 1, 1, 0, 0, - (char *) &default_keep_going_flag, "keep-going" }, -#ifndef NO_FLOAT - { 'l', floating, (char *) &max_load_average, 1, 1, 0, - (char *) &default_load_average, (char *) &default_load_average, - "load-average" }, -#else - { 'l', positive_int, (char *) &max_load_average, 1, 1, 0, - (char *) &default_load_average, (char *) &default_load_average, - "load-average" }, -#endif - { 'm', ignore, 0, 0, 0, 0, 0, 0, 0 }, - { 'n', flag, (char *) &just_print_flag, 1, 1, 1, 0, 0, "just-print" }, - { 'o', string, (char *) &old_files, 0, 0, 0, 0, 0, "old-file" }, - { 'p', flag, (char *) &print_data_base_flag, 1, 1, 0, 0, 0, - "print-data-base" }, - { 'q', flag, (char *) &question_flag, 1, 1, 1, 0, 0, "question" }, - { 'r', flag, (char *) &no_builtin_rules_flag, 1, 1, 0, 0, 0, - "no-builtin-rules" }, - { 'R', flag, (char *) &no_builtin_variables_flag, 1, 1, 0, 0, 0, - "no-builtin-variables" }, - { 's', flag, (char *) &silent_flag, 1, 1, 0, 0, 0, "silent" }, - { 'S', flag_off, (char *) &keep_going_flag, 1, 1, 0, 0, - (char *) &default_keep_going_flag, "no-keep-going" }, - { 't', flag, (char *) &touch_flag, 1, 1, 1, 0, 0, "touch" }, - { 'v', flag, (char *) &print_version_flag, 1, 1, 0, 0, 0, "version" }, - { 'w', flag, (char *) &print_directory_flag, 1, 1, 0, 0, 0, - "print-directory" }, - { CHAR_MAX+3, flag, (char *) &inhibit_print_directory_flag, 1, 1, 0, 0, 0, - "no-print-directory" }, - { 'W', string, (char *) &new_files, 0, 0, 0, 0, 0, "what-if" }, - { CHAR_MAX+4, flag, (char *) &warn_undefined_variables_flag, 1, 1, 0, 0, 0, - "warn-undefined-variables" }, - { '\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. */ - -char *program; - -/* Our current directory before processing any -C options. */ - -char *directory_before_chdir; - -/* Our current directory after processing all -C options. */ - -char *starting_directory; - -/* Value of the MAKELEVEL variable at startup (or 0). */ - -unsigned int makelevel; - -/* First file defined in the makefile whose name does not - start with `.'. This is the default to remake if the - command line does not specify. */ - -struct file *default_goal_file; - -/* 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 `.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; - -/* 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 !defined HAVE_BSD_SIGNAL && !defined bsd_signal -# if !defined HAVE_SIGACTION -# define bsd_signal signal -# else -typedef RETSIGTYPE (*bsd_signal_ret_t) (); - -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 (); - init_hash_files (); - hash_init_directories (); - hash_init_function_table (); -} - -static struct file * -enter_command_line_file (char *name) -{ - if (name[0] == '\0') - fatal (NILF, _("empty string invalid as file name")); - - if (name[0] == '~') - { - char *expanded = tilde_expand (name); - if (expanded != 0) - name = expanded; /* Memory leak; I don't care. */ - } - - /* 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] != '\0') - { - name += 2; - while (*name == '/') - /* Skip following slashes: ".//foo" is "foo", not "/foo". */ - ++name; - } - - if (*name == '\0') - { - /* It was all slashes! Move back to the dot and truncate - it after the first slash, so it becomes just "./". */ - do - --name; - while (name[0] != '.'); - name[2] = '\0'; - } - - return enter_file (xstrdup (name)); -} - -/* Toggle -d on receipt of SIGUSR1. */ - -static RETSIGTYPE -debug_signal_handler (int sig) -{ - db_level = db_level ? DB_NONE : DB_BASIC; -} - -static void -decode_debug_flags (void) -{ - char **pp; - - if (debug_flag) - db_level = DB_ALL; - - if (!db_flags) - return; - - 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 'v': - db_level |= DB_BASIC | DB_VERBOSE; - break; - default: - fatal (NILF, _("unknown debug level specification `%s'"), p); - } - - while (*(++p) != '\0') - if (*p == ',' || *p == ' ') - break; - - if (*p == '\0') - break; - - ++p; - } - } -} - -#ifdef WINDOWS32 -/* - * 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%x, addr = 0x%x)\n"), - prg, exrec->ExceptionCode, exrec->ExceptionAddress); - fprintf(stderr, errmsg); - exit(255); - } - - sprintf(errmsg, - _("\nUnhandled exception filter called from program %s\nExceptionCode = %x\nExceptionFlags = %x\nExceptionAddress = %x\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 %x\n") - : _("Access violation: read operation at address %x\n")), - 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 propogate /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 (char *token) -{ - int sh_found = 0; - char* search_token; - PATH_VAR(sh_path); - extern char *default_shell; - - if (!token) - search_token = default_shell; - else - search_token = token; - - 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 (file_exists_p(search_token)) { - /* 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 ("Path", 4); - - /* - * Search Path for shell - */ - if (v && v->value) { - char *ep; - - p = v->value; - ep = strchr(p, PATH_SEPARATOR_CHAR); - - while (ep && *ep) { - *ep = '\0'; - - if (dir_file_exists_p(p, search_token)) { - sprintf(sh_path, "%s/%s", p, search_token); - 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 && dir_file_exists_p(p, search_token)) { - sprintf(sh_path, "%s/%s", p, search_token); - 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 - - return (sh_found); -} -#endif /* WINDOWS32 */ - -#ifdef __MSDOS__ - -static void -msdos_return_to_initial_directory (void) -{ - if (directory_before_chdir) - chdir (directory_before_chdir); -} -#endif - -extern char *mktemp PARAMS ((char *template)); -extern int mkstemp PARAMS ((char *template)); - -FILE * -open_tmpfile(char **name, const char *template) -{ - int fd; - -#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 -} - - -#ifdef _AMIGA -int -main (int argc, char **argv) -#else -int -main (int argc, char **argv, char **envp) -#endif -{ - static char *stdin_nm = 0; - register struct file *f; - register unsigned int i; - char **p; - struct dep *read_makefiles; - PATH_VAR (current_directory); -#ifdef WINDOWS32 - char *unix_path = NULL; - char *windows32_path = NULL; - - SetUnhandledExceptionFilter(handle_runtime_exceptions); - - /* start off assuming we have no shell */ - unixy_shell = 0; - no_default_sh_exe = 1; -#endif - - /* Needed for OS/2 */ - initialize_main(&argc, &argv); - - default_goal_file = 0; - reading_file = 0; - -#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, ""); - bindtextdomain (PACKAGE, LOCALEDIR); - 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) -#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 - - /* Make 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, (char *) 0, _IOLBF, BUFSIZ); -# endif /* setvbuf reversed. */ -#elif HAVE_SETLINEBUF - setlinebuf (stdout); -#endif /* setlinebuf missing. */ - - /* Figure out where this program lives. */ - - if (argv[0] == 0) - argv[0] = ""; - if (argv[0][0] == '\0') - program = "make"; - else - { -#ifdef VMS - program = strrchr (argv[0], ']'); -#else - program = strrchr (argv[0], '/'); -#endif -#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 - if (program == 0) - program = argv[0]; - 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 - 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 (".VARIABLES", 10, "", o_default, 0)->special = 1; - /* define_variable (".TARGETS", 8, "", o_default, 0); */ - - /* 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 - for (i = 0; envp[i] != 0; ++i) - { - int do_not_define; - register char *ep = envp[i]; - - /* by default, everything gets defined and exported */ - do_not_define = 0; - - while (*ep != '=') - ++ep; -#ifdef WINDOWS32 - if (!unix_path && strneq(envp[i], "PATH=", 5)) - unix_path = ep+1; - else if (!windows32_path && !strnicmp(envp[i], "Path=", 5)) { - do_not_define = 1; /* it gets defined after loop exits */ - windows32_path = ep+1; - } -#endif - /* The result of pointer arithmetic is cast to unsigned int for - machines where ptrdiff_t is a different size that doesn't widen - the same. */ - if (!do_not_define) - define_variable (envp[i], (unsigned int) (ep - envp[i]), - ep + 1, o_env, 1) - /* Force exportation of every variable culled from the environment. - We used to rely on target_environment's v_default code to do this. - But that does not work for the case where an environment variable - is redefined in a makefile with `override'; it should then still - be exported, because it was originally in the environment. */ - ->export = v_export; - } -#ifdef WINDOWS32 - /* - * Make sure that this particular spelling of 'Path' is available - */ - if (windows32_path) - define_variable("Path", 4, windows32_path, o_env, 1)->export = v_export; - else if (unix_path) - define_variable("Path", 4, unix_path, o_env, 1)->export = v_export; - else - define_variable("Path", 4, "", o_env, 1)->export = v_export; - - /* - * PATH defaults to Path iff PATH not found and Path is found. - */ - if (!unix_path && windows32_path) - define_variable("PATH", 4, 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 ("MAKEFLAGS", 9); -#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 ("MFLAGS", 6); -#endif - decode_switches (argc, argv, 0); -#ifdef WINDOWS32 - if (suspend_flag) { - fprintf(stderr, "%s (pid = %d)\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 - - decode_debug_flags (); - - /* Print version information. */ - - if (print_version_flag || print_data_base_flag || db_level) - print_version (); - - /* `make --version' is supposed to just print the version and exit. */ - if (print_version_flag) - die (0); - -#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] != ':'))) - argv[0] = concat (current_directory, "/", argv[0]); -#else /* !__MSDOS__ */ - if (current_directory[0] != '\0' - && argv[0] != 0 && argv[0][0] != '/' && strchr (argv[0], '/') != 0) - argv[0] = concat (current_directory, "/", argv[0]); -#endif /* !__MSDOS__ */ -#endif /* WINDOWS32 */ -#endif - - /* The extra indirection through $(MAKE_COMMAND) is done - for hysterical raisins. */ - (void) define_variable ("MAKE_COMMAND", 12, argv[0], o_default, 0); - (void) define_variable ("MAKE", 4, "$(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 = (char *) 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. */ - (void) define_variable ("-*-command-variables-*-", 23, - 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. */ - (void) define_variable ("MAKEOVERRIDES", 13, - "${-*-command-variables-*-}", o_env, 1); - } - - /* If there were -C flags, move ourselves about. */ - if (directories != 0) - for (i = 0; directories->list[i] != 0; ++i) - { - char *dir = directories->list[i]; - if (dir[0] == '~') - { - char *expanded = tilde_expand (dir); - if (expanded != 0) - dir = expanded; - } - if (chdir (dir) < 0) - pfatal_with_name (dir); - if (dir != directories->list[i]) - free (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 */ - /* Figure out the level of recursion. */ - { - struct variable *v = lookup_variable (MAKELEVEL_NAME, MAKELEVEL_LENGTH); - if (v != 0 && v->value[0] != '\0' && v->value[0] != '-') - makelevel = (unsigned int) atoi (v->value); - else - makelevel = 0; - } - - /* 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 ? (char **) 0 - : include_directories->list); - - /* Figure out where we are now, after chdir'ing. */ - if (directories == 0) - /* We didn't move, so we're still in the same place. */ - starting_directory = current_directory; - else - { -#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 - error (NILF, "getwd: %s", current_directory); -#endif - starting_directory = 0; - } - else - starting_directory = current_directory; - } - - (void) define_variable ("CURDIR", 6, current_directory, o_default, 0); - - /* Read any stdin makefiles into temporary files. */ - - if (makefiles != 0) - { - register 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, *tmpdir; - - if (stdin_nm) - 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 = (char *) alloca (strlen (tmpdir) - + sizeof (DEFAULT_TMPFILE) + 1); - 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 = open_tmpfile (&stdin_nm, template); - if (outfile == 0) - pfatal_with_name (_("fopen (temporary file)")); - while (!feof (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)")); - } - (void) fclose (outfile); - - /* Replace the name that read_all_makefiles will - see with the name of the temporary file. */ - makefiles->list[i] = xstrdup (stdin_nm); - - /* Make sure the temporary file will not be remade. */ - f = enter_file (stdin_nm); - f->updated = 1; - f->update_status = 0; - 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. */ - { - extern RETSIGTYPE child_handler PARAMS ((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 - so makefiles can look at them. */ - - define_makeflags (0, 0); - - /* Define the default variables. */ - define_default_variables (); - - /* Read all the makefiles. */ - - default_file = enter_file (".DEFAULT"); - - read_makefiles - = read_all_makefiles (makefiles == 0 ? (char **) 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); - - if (no_default_sh_exe && job_slots != 1) { - error (NILF, _("Do not specify -j or --jobs if sh.exe is not available.")); - error (NILF, _("Resetting make for single job mode.")); - job_slots = 1; - } -#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 ("SHELL", 5); - extern int unixy_shell; - extern 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__ */ - - /* Decode switches again, in case the variables were set by the makefile. */ - decode_env_switches ("MAKEFLAGS", 9); -#if 0 - decode_env_switches ("MFLAGS", 6); -#endif - -#if defined (__MSDOS__) || defined (__EMX__) - if (job_slots != 1 -# ifdef __EMX__ - && _osmode != OS2_MODE /* turn off -j if we are in DOS mode */ -# endif - ) - { - error (NILF, - _("Parallel jobs (-j) are not supported on this platform.")); - error (NILF, _("Resetting to single job (-j1) mode.")); - job_slots = 1; - } -#endif - -#ifdef MAKE_JOBSERVER - /* If the jobserver-fds option is seen, make sure that -j is reasonable. */ - - if (jobserver_fds) - { - char *cp; - - for (i=1; i < jobserver_fds->idx; ++i) - if (!streq (jobserver_fds->list[0], jobserver_fds->list[i])) - fatal (NILF, _("internal error: multiple --jobserver-fds options")); - - /* Now parse the fds string and make sure it has the proper format. */ - - cp = jobserver_fds->list[0]; - - if (sscanf (cp, "%d,%d", &job_fds[0], &job_fds[1]) != 2) - fatal (NILF, - _("internal error: invalid --jobserver-fds string `%s'"), cp); - - /* 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 (job_slots > 0) - error (NILF, - _("warning: -jN forced in submake: disabling jobserver mode.")); - - /* 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 ((job_rfd = dup (job_fds[0])) < 0) - { - if (errno != EBADF) - pfatal_with_name (_("dup jobserver")); - - error (NILF, - _("warning: jobserver unavailable: using -j1. Add `+' to parent make rule.")); - job_slots = 1; - } - - if (job_slots > 0) - { - close (job_fds[0]); - close (job_fds[1]); - job_fds[0] = job_fds[1] = -1; - free (jobserver_fds->list); - free (jobserver_fds); - jobserver_fds = 0; - } - } - - /* 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) - { - char c = '+'; - - if (pipe (job_fds) < 0 || (job_rfd = dup (job_fds[0])) < 0) - pfatal_with_name (_("creating jobs pipe")); - - /* 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. */ - - while (--job_slots) - { - int r; - - EINTRLOOP (r, write (job_fds[1], &c, 1)); - if (r != 1) - pfatal_with_name (_("init jobserver pipe")); - } - - /* Fill in the jobserver_fds struct for our children. */ - - jobserver_fds = (struct stringlist *) - xmalloc (sizeof (struct stringlist)); - jobserver_fds->list = (char **) xmalloc (sizeof (char *)); - jobserver_fds->list[0] = xmalloc ((sizeof ("1024")*2)+1); - - sprintf (jobserver_fds->list[0], "%d,%d", job_fds[0], job_fds[1]); - jobserver_fds->idx = 1; - jobserver_fds->max = 1; - } -#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 (old_files != 0) - for (p = old_files->list; *p != 0; ++p) - { - f = enter_command_line_file (*p); - f->last_mtime = f->mtime_before_update = OLD_MTIME; - f->updated = 1; - f->update_status = 0; - f->command_state = cs_finished; - } - - if (new_files != 0) - { - for (p = new_files->list; *p != 0; ++p) - { - f = enter_command_line_file (*p); - f->last_mtime = f->mtime_before_update = NEW_MTIME; - } - } - - /* Initialize the remote job module. */ - remote_setup (); - - if (read_makefiles != 0) - { - /* Update any makefiles if necessary. */ - - FILE_TIMESTAMP *makefile_mtimes = 0; - unsigned int mm_idx = 0; - char **nargv = argv; - int nargc = argc; - int orig_db_level = db_level; - - 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_makefiles; - while (d != 0) - { - register 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_makefiles = d->next; - else - last->next = d->next; - - /* Free the storage. */ - free ((char *) d); - - d = last == 0 ? read_makefiles : last->next; - - break; - } - } - if (f == NULL || !f->double_colon) - { - makefile_mtimes = (FILE_TIMESTAMP *) - xrealloc ((char *) 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); - - switch (update_goal_chain (read_makefiles, 1)) - { - case 1: - /* 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 -1: - /* Did nothing. */ - break; - - case 2: - /* 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; - register unsigned int i; - struct dep *d; - - for (i = 0, d = read_makefiles; 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 == 0) - { - /* 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. */ - 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]); - } - } - else - /* This makefile was not found at all. */ - if (! (d->changed & RM_DONTCARE)) - { - /* 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, - _("Included makefile `%s' was not found."), - dep_name (d)); - else - { - /* A normal makefile. We must die later. */ - error (NILF, _("Makefile `%s' was not found"), - dep_name (d)); - any_failed = 1; - } - } - } - /* Reset this to empty so we get the right error message below. */ - read_makefiles = 0; - - if (any_remade) - goto re_exec; - if (any_failed) - die (2); - break; - } - - case 0: - re_exec: - /* Updated successfully. Re-exec ourselves. */ - - remove_intermediates (0); - - if (print_data_base_flag) - print_data_base (); - - log_working_directory (0); - - if (makefiles != 0) - { - /* These names might have changed. */ - register unsigned int i, j = 0; - for (i = 1; i < argc; ++i) - if (strneq (argv[i], "-f", 2)) /* XXX */ - { - char *p = &argv[i][2]; - if (*p == '\0') - argv[++i] = makefiles->list[j]; - else - argv[i] = concat ("-f", makefiles->list[j], ""); - ++j; - } - } - - /* Add -o option for the stdin temporary file, if necessary. */ - if (stdin_nm) - { - nargv = (char **) xmalloc ((nargc + 2) * sizeof (char *)); - bcopy ((char *) argv, (char *) nargv, argc * sizeof (char *)); - nargv[nargc++] = concat ("-o", stdin_nm, ""); - nargv[nargc] = 0; - } - - if (directories != 0 && directories->idx > 0) - { - char bad; - if (directory_before_chdir != 0) - { - if (chdir (directory_before_chdir) < 0) - { - perror_with_name ("chdir", ""); - bad = 1; - } - else - bad = 0; - } - else - bad = 1; - if (bad) - fatal (NILF, _("Couldn't change back to original directory.")); - } - -#ifndef _AMIGA - for (p = environ; *p != 0; ++p) - if ((*p)[MAKELEVEL_LENGTH] == '=' - && strneq (*p, MAKELEVEL_NAME, MAKELEVEL_LENGTH)) - { - /* The SGI compiler apparently can't understand - the concept of storing the result of a function - in something other than a local variable. */ - char *sgi_loses; - sgi_loses = (char *) alloca (40); - *p = sgi_loses; - sprintf (*p, "%s=%u", MAKELEVEL_NAME, makelevel); - break; - } -#else /* AMIGA */ - { - char buffer[256]; - int len; - - len = GetVar (MAKELEVEL_NAME, buffer, sizeof (buffer), GVF_GLOBAL_ONLY); - - if (len != -1) - { - sprintf (buffer, "%u", makelevel); - SetVar (MAKELEVEL_NAME, buffer, -1, GVF_GLOBAL_ONLY); - } - } -#endif - - if (ISDB (DB_BASIC)) - { - char **p; - fputs (_("Re-executing:"), stdout); - for (p = nargv; *p != 0; ++p) - printf (" %s", *p); - putchar ('\n'); - } - - 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 status; - pid = child_execute_job(0, 1, nargv, environ); - - /* is this loop really necessary? */ - do { - pid = wait(&status); - } while(pid <= 0); - /* use the exit code of the child process */ - exit(WIFEXITED(status) ? WEXITSTATUS(status) : EXIT_FAILURE); - } -#else - exec_command (nargv, environ); -#endif - /* NOTREACHED */ - - default: -#define BOGUS_UPDATE_STATUS 0 - assert (BOGUS_UPDATE_STATUS); - break; - } - - db_level = orig_db_level; - } - - /* Set up `MAKEFLAGS' again for the normal targets. */ - define_makeflags (1, 0); - - /* 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); - - { - int status; - - /* If there were no command-line goals, use the default. */ - if (goals == 0) - { - if (default_goal_file != 0) - { - goals = (struct dep *) xmalloc (sizeof (struct dep)); - goals->next = 0; - goals->name = 0; - goals->ignore_mtime = 0; - goals->file = default_goal_file; - } - } - else - lastgoal->next = 0; - - if (!goals) - { - if (read_makefiles == 0) - fatal (NILF, _("No targets specified and no makefile found")); - - fatal (NILF, _("No targets")); - } - - /* Update the goals. */ - - DB (DB_BASIC, (_("Updating goal targets....\n"))); - - switch (update_goal_chain (goals, 0)) - { - case -1: - /* Nothing happened. */ - case 0: - /* Updated successfully. */ - status = MAKE_SUCCESS; - break; - case 1: - /* We are under -q and would run some commands. */ - status = MAKE_TROUBLE; - break; - case 2: - /* Updating failed. POSIX.2 specifies exit status >1 for this; - but in VMS, there is only success and failure. */ - status = MAKE_FAILURE; - break; - default: - abort (); - } - - /* If we detected some clock skew, generate one last warning */ - if (clock_skew_detected) - error (NILF, - _("warning: Clock skew detected. Your build may be incomplete.")); - - /* Exit. */ - die (status); - } - - return 0; -} - -/* 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) -{ - register char *p; - register int c; - register 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 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; -} - -static void -handle_non_switch_argument (char *arg, int env) -{ - /* Non-option argument. It might be a variable definition. */ - 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. Record a pointer to - the variable for later use in define_makeflags. */ - struct command_variable *cv - = (struct command_variable *) 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_command_line_file (arg); - f->cmd_target = 1; - - if (goals == 0) - { - goals = (struct dep *) xmalloc (sizeof (struct dep)); - lastgoal = goals; - } - else - { - lastgoal->next = (struct dep *) xmalloc (sizeof (struct dep)); - lastgoal = lastgoal->next; - } - lastgoal->name = 0; - lastgoal->file = f; - lastgoal->ignore_mtime = 0; - - { - /* Add this target name to the MAKECMDGOALS variable. */ - struct variable *v; - char *value; - - v = lookup_variable ("MAKECMDGOALS", 12); - if (v == 0) - value = f->name; - else - { - /* Paste the old and new values together */ - unsigned int oldlen, newlen; - - oldlen = strlen (v->value); - newlen = strlen (f->name); - value = (char *) alloca (oldlen + 1 + newlen + 1); - bcopy (v->value, value, oldlen); - value[oldlen] = ' '; - bcopy (f->name, &value[oldlen + 1], newlen + 1); - } - define_variable ("MAKECMDGOALS", 12, 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, 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) - { - /* Parse the next argument. */ - c = getopt_long (argc, argv, options, long_options, (int *) 0); - 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 (optarg, 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: - if (!doit) - break; - - if (optarg == 0) - optarg = cs->noarg_value; - - sl = *(struct stringlist **) cs->value_ptr; - if (sl == 0) - { - sl = (struct stringlist *) - xmalloc (sizeof (struct stringlist)); - sl->max = 5; - sl->idx = 0; - sl->list = (char **) xmalloc (5 * sizeof (char *)); - *(struct stringlist **) cs->value_ptr = sl; - } - else if (sl->idx == sl->max - 1) - { - sl->max += 5; - sl->list = (char **) - xrealloc ((char *) sl->list, - sl->max * sizeof (char *)); - } - sl->list[sl->idx++] = optarg; - 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 (optarg == 0 && argc > optind) - { - const char *cp; - for (cp=argv[optind]; ISDIGIT (cp[0]); ++cp) - ; - if (cp[0] == '\0') - optarg = argv[optind++]; - } - - if (!doit) - break; - - if (optarg != 0) - { - int i = atoi (optarg); - const char *cp; - - /* Yes, I realize we're repeating this in some cases. */ - for (cp = optarg; ISDIGIT (cp[0]); ++cp) - ; - - if (i < 1 || cp[0] != '\0') - { - error (NILF, _("the `-%c' option requires a positive integral 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 (optarg == 0 && optind < argc - && (ISDIGIT (argv[optind][0]) || argv[optind][0] == '.')) - optarg = argv[optind++]; - - if (doit) - *(double *) cs->value_ptr - = (optarg != 0 ? atof (optarg) - : *(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 ? 2 : 0); - } -} - -/* 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 (char *envar, unsigned int len) -{ - char *varref = (char *) alloca (2 + len + 2); - char *value, *p; - int argc; - char **argv; - - /* Get the variable's value. */ - varref[0] = '$'; - varref[1] = '('; - bcopy (envar, &varref[2], 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 = (char **) alloca ((1 + len + 1) * sizeof (char *)); - - /* Allocate a buffer to copy the value into while we split it into words - and unquote it. We must use permanent storage for this because - decode_switches may store pointers into the passed argument words. */ - p = (char *) xmalloc (2 * len); - - /* getopt will look at the arguments starting at ARGV[1]. - Prepend a spacer word. */ - argv[0] = 0; - argc = 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; - - if (argv[1][0] != '-' && strchr (argv[1], '=') == 0) - /* The first word doesn't start with a dash and isn't a variable - definition. Add a dash and pass it along to decode_switches. We - need permanent storage for this in case decode_switches saves - pointers into the value. */ - argv[1] = concat ("-", argv[1], ""); - - /* 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, 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 void -define_makeflags (int all, int makefile) -{ - static const char ref[] = "$(MAKEOVERRIDES)"; - static const char posixref[] = "$(-*-command-variables-*-)"; - register const struct command_switch *cs; - char *flagstring; - register char *p; - unsigned int words; - struct variable *v; - - /* 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; - char *arg; - }; - struct flag *flags = 0; - unsigned int flagslen = 0; -#define ADD_FLAG(ARG, LEN) \ - do { \ - struct flag *new = (struct flag *) alloca (sizeof (struct flag)); \ - new->cs = cs; \ - new->arg = (ARG); \ - new->next = flags; \ - flags = new; \ - if (new->arg == 0) \ - ++flagslen; /* Just a single flag letter. */ \ - else \ - flagslen += 1 + 1 + 1 + 1 + 3 * (LEN); /* " -x foo" */ \ - 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) - { - default: - abort (); - - 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 if (cs->c == 'j') - /* Special case for `-j'. */ - ADD_FLAG ("1", 1); - else - { - char *buf = (char *) 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 = (char *) alloca (100); - sprintf (buf, "%g", *(double *) cs->value_ptr); - ADD_FLAG (buf, strlen (buf)); - } - } - break; -#endif - - case string: - if (all) - { - struct stringlist *sl = *(struct stringlist **) cs->value_ptr; - if (sl != 0) - { - /* Add the elements in reverse order, because - all the flags get reversed below; and the order - matters for some switches (like -I). */ - register unsigned int i = sl->idx; - while (i-- > 0) - ADD_FLAG (sl->list[i], strlen (sl->list[i])); - } - } - break; - } - - flagslen += 4 + sizeof posixref; /* Four more for the possible " -- ". */ - -#undef ADD_FLAG - - /* Construct the value in FLAGSTRING. - We allocate enough space for a preceding dash and trailing null. */ - flagstring = (char *) alloca (1 + flagslen + 1); - bzero (flagstring, 1 + flagslen + 1); - p = flagstring; - words = 1; - *p++ = '-'; - while (flags != 0) - { - /* Add the flag letter or name to the string. */ - if (short_option (flags->cs->c)) - *p++ = flags->cs->c; - else - { - if (*p != '-') - { - *p++ = ' '; - *p++ = '-'; - } - *p++ = '-'; - strcpy (p, flags->cs->long_name); - p += strlen (p); - } - if (flags->arg != 0) - { - /* A flag that takes an optional argument which in this case is - omitted is specified by ARG being "". We must distinguish - because a following flag appended without an intervening " -" - is considered the arg for the first. */ - if (flags->arg[0] != '\0') - { - /* Add its argument too. */ - *p++ = !short_option (flags->cs->c) ? '=' : ' '; - p = quote_for_env (p, flags->arg); - } - ++words; - /* Write a following space and dash, for the next flag. */ - *p++ = ' '; - *p++ = '-'; - } - else if (!short_option (flags->cs->c)) - { - ++words; - /* Long options must each go in their own word, - so we write the following space and dash. */ - *p++ = ' '; - *p++ = '-'; - } - flags = flags->next; - } - - /* Define MFLAGS before appending variable definitions. */ - - if (p == &flagstring[1]) - /* No flags. */ - flagstring[0] = '\0'; - else if (p[-1] == '-') - { - /* Kill the final space and dash. */ - p -= 2; - *p = '\0'; - } - else - /* Terminate the string. */ - *p = '\0'; - - /* Since MFLAGS is not parsed for flags, there is no reason to - override any makefile redefinition. */ - (void) define_variable ("MFLAGS", 6, flagstring, o_env, 1); - - if (all && command_variables != 0) - { - /* Now write a reference to $(MAKEOVERRIDES), which contains all the - command-line variable definitions. */ - - if (p == &flagstring[1]) - /* No flags written, so elide the leading dash already written. */ - p = flagstring; - else - { - /* Separate the variables from the switches with a "--" arg. */ - if (p[-1] != '-') - { - /* We did not already write a trailing " -". */ - *p++ = ' '; - *p++ = '-'; - } - /* There is a trailing " -"; fill it out to " -- ". */ - *p++ = '-'; - *p++ = ' '; - } - - /* Copy in the string. */ - if (posix_pedantic) - { - bcopy (posixref, p, sizeof posixref - 1); - p += sizeof posixref - 1; - } - else - { - bcopy (ref, p, sizeof ref - 1); - p += sizeof ref - 1; - } - } - else if (p == &flagstring[1]) - { - words = 0; - --p; - } - else if (p[-1] == '-') - /* Kill the final space and dash. */ - p -= 2; - /* Terminate the string. */ - *p = '\0'; - - v = define_variable ("MAKEFLAGS", 9, - /* If there are switches, omit the leading dash - unless it is a single long option with two - leading dashes. */ - &flagstring[(flagstring[0] == '-' - && flagstring[1] != '-') - ? 1 : 0], - /* 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. Of course, an override or command - definition will still take precedence. */ - o_file, 1); - if (! all) - /* The first time we are called, set MAKEFLAGS to always be exported. - We should not do this again on the second call, because that is - after reading makefiles which might have done `unexport MAKEFLAGS'. */ - v->export = v_export; -} - -/* Print version information. */ - -static void -print_version (void) -{ - static int printed_version = 0; - - char *precede = print_data_base_flag ? "# " : ""; - - if (printed_version) - /* Do it only once. */ - return; - - /* 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 ("%sGNU Make %s\n\ -%sCopyright (C) 2003 Free Software Foundation, Inc.\n", - precede, version_string, precede); - - printf (_("%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"), - precede, precede, precede); - - if (!remote_description || *remote_description == '\0') - printf (_("\n%sThis program built for %s\n"), precede, make_host); - else - printf (_("\n%sThis program built for %s (%s)\n"), - precede, make_host, remote_description); - - printed_version = 1; - - /* Flush stdout so the user doesn't have to wait to see the - version information while things are thought about. */ - fflush (stdout); -} - -/* Print a bunch of information about this and that. */ - -static void -print_data_base (void) -{ - time_t when; - - when = time ((time_t *) 0); - 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 (); - - when = time ((time_t *) 0); - printf (_("\n# Finished Make data base on %s\n"), ctime (&when)); -} - -/* 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. */ - for (err = (status != 0); job_slots_used > 0; err = 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 (); - - /* 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) - chdir (directory_before_chdir); - - log_working_directory (0); - } - - exit (status); -} - -/* Write a message indicating that we've just entered or - left (according to ENTERING) the current directory. */ - -void -log_working_directory (int entering) -{ - static int entered = 0; - - /* Print nothing without the flag. Don't print the entering message - again if we already have. Don't print the leaving message if we - haven't printed the entering message. */ - if (! print_directory_flag || entering == entered) - return; - - entered = entering; - - if (print_data_base_flag) - fputs ("# ", stdout); - - /* Use entire sentences to give the translators a fighting chance. */ - - if (makelevel == 0) - if (starting_directory == 0) - if (entering) - printf (_("%s: Entering an unknown directory\n"), program); - else - printf (_("%s: Leaving an unknown directory\n"), program); - else - if (entering) - printf (_("%s: Entering directory `%s'\n"), - program, starting_directory); - else - printf (_("%s: Leaving directory `%s'\n"), - program, starting_directory); - else - if (starting_directory == 0) - if (entering) - printf (_("%s[%u]: Entering an unknown directory\n"), - program, makelevel); - else - printf (_("%s[%u]: Leaving an unknown directory\n"), - program, makelevel); - else - if (entering) - printf (_("%s[%u]: Entering directory `%s'\n"), - program, makelevel, starting_directory); - else - printf (_("%s[%u]: Leaving directory `%s'\n"), - program, makelevel, starting_directory); -} diff --git a/src/gmake/maintMakefile b/src/gmake/maintMakefile deleted file mode 100644 index 796a221e..00000000 --- a/src/gmake/maintMakefile +++ /dev/null @@ -1,233 +0,0 @@ -# Maintainer-only makefile segment. This contains things that are relevant -# only if you have the full copy of the GNU make sources from the CVS -# tree, not a dist copy. -# - -# Find the glob source files... this might be dangerous, but we're maintainers! -# -globsrc := $(wildcard glob/*.c) -globhdr := $(wildcard glob/*.h) - -TEMPLATES = README README.DOS README.W32 README.OS2 \ - config.ami configh.dos config.h.W32 config.h-vms -MTEMPLATES = Makefile.DOS SMakefile - -all-am: $(TEMPLATES) $(MTEMPLATES) build.sh.in - -# We need this to ensure that README and build.sh.in are created on time to -# avoid errors by automake. -# -#Makefile.in: README build.sh.in - -# General rule for turning a .template into a regular file. -# -$(TEMPLATES) : % : %.template Makefile - rm -f $@ - sed -e 's@%VERSION%@$(VERSION)@g' \ - -e 's@%PACKAGE%@$(PACKAGE)@g' \ - $< > $@ - chmod a-w $@ - -# Construct Makefiles by adding on dependencies, etc. -# -$(MTEMPLATES) : % : %.template .dep_segment Makefile - rm -f $@ - sed -e 's@%VERSION%@$(VERSION)@g' \ - -e 's@%PROGRAMS%@$(bin_PROGRAMS)@g' \ - -e 's@%SOURCES%@$(filter-out remote-%,$(make_SOURCES)) remote-$$(REMOTE).c@g' \ - -e 's@%OBJECTS%@$(filter-out remote-%,$(make_OBJECTS)) remote-$$(REMOTE).o@g' \ - -e 's@%GLOB_SOURCES%@$(globsrc) $(globhdr)@g' \ - -e 's@%GLOB_OBJECTS%@$(globsrc:glob/%.c=%.o)@g' \ - $< > $@ - echo >>$@; echo '# --------------- DEPENDENCIES' >>$@; echo '#' >>$@; \ - cat $(word 2,$^) >>$@ - chmod a-w $@ - -NMakefile: NMakefile.template .dep_segment Makefile - rm -f $@ - cp $< $@ - echo >>$@; echo '# --------------- DEPENDENCIES' >>$@; echo '#' >>$@; \ - sed 's/^\([^ ]*\)\.o:/$$(OUTDIR)\/\1.obj:/' $(word 2,$^) >>$@ - chmod a-w $@ - -# Construct build.sh.in -# -build.sh.in: build.template Makefile - rm -f $@ - sed -e 's@%objs%@$(patsubst %.o,%.$${OBJEXT},$(filter-out remote-%,$(make_OBJECTS)))@g' \ - -e 's@%globobjs%@$(patsubst %.c,%.$${OBJEXT},$(globsrc)))@g' \ - $< > $@ - chmod a-w+x $@ - - -# Use automake to build a dependency list file, for "foreign" makefiles like -# Makefile.DOS. -# -# Automake used to have a --generate-deps flag, but it's gone now, so we have -# to do it ourselves. -# -.dep_segment: Makefile.am maintMakefile $(DEP_FILES) - cat $(DEP_FILES) \ - | sed -e '/^[^:]*\.[ch] *:/d' \ - -e 's, /usr/[^ ]*,,g' \ - -e 's, $(srcdir)/, ,g' \ - -e '/^ \\$$/d' \ - > $@ - -# Get rid of everything "else". -# -maintFILES = configure aclocal.m4 config.h.in Makefile.in stamp-h.in - -CVS-CLEAN-FILES += $(maintFILES) $(TEMPLATES) $(MTEMPLATES) NMakefile \ - missing build.sh.in .dep_segment po-check-? - -# This rule tries to clean the tree right down to how it looks when you do a -# virgin CVS checkout. - -.PHONY: cvs-clean -cvs-clean: maintainer-clean - -rm -f *~ - -rm -f config/*~ config/Makefile.in config/[a-z]* - -rm -f po/*~ po/Makefile.in.in po/Rules-quot po/[a-z]* - -rm -f doc/*~ doc/Makefile.in doc/fdl.texi doc/make-stds.texi \ - doc/texinfo.tex - -rm -f glob/*~ glob/Makefile.in - -rm -f ABOUT-NLS $(CVS-CLEAN-FILES) - - -# ---------------------------------------------------------------------- -# -# The sections below were stolen from the Makefile.maint used by fileutils, -# sh-utils, textutils, CPPI, Bison, and Autoconf. - - -## ---------------- ## -## Updating files. ## -## ---------------- ## - -WGET = wget --passive-ftp --non-verbose -ftp-gnu = ftp://ftp.gnu.org/gnu - -move_if_change = if test -r $(target) && cmp -s $(target).t $(target); then \ - echo $(target) is unchanged; rm -f $(target).t; \ - else \ - mv $(target).t $(target); \ - fi - -# ------------------- # -# Updating PO files. # -# ------------------- # - -po_repo = http://www2.iro.umontreal.ca/%7Egnutra/po/maint/$(PACKAGE) -.PHONY: do-po-update po-update -do-po-update: - tmppo=/tmp/$(PACKAGE)-$(VERSION)-po &&\ - rm -rf $$tmppo && \ - mkdir $$tmppo && \ - (cd $$tmppo && $(WGET) -r -l1 -nd --no-parent -A '*.po' $(po_repo)) &&\ - cp $$tmppo/*.po po - cd po && $(MAKE) update-po - $(MAKE) po-check - -po-update: - if test -d "po"; then \ - $(MAKE) do-po-update; \ - fi - -# -------------------------- # -# Updating GNU build tools. # -# -------------------------- # - -# The following pseudo table associates a local directory and a URL -# with each of the files that belongs to some other package and is -# regularly updated from the specified URL. -# $(srcdir)/src/ansi2knr.c - - -wget_files ?= $(srcdir)/doc/texinfo.tex $(srcdir)/doc/make-stds.texi \ - $(srcdir)/doc/fdl.texi - -wget-targets = $(patsubst %, get-%, $(wget_files)) - -ansi2knr.c-url_prefix = ftp://ftp.cs.wisc.edu/ghost/ - -texinfo.tex-url_prefix = $(ftp-gnu)/texinfo/ - -standards.texi-url_prefix = $(ftp-gnu)/GNUinfo/ -make-stds.texi-url_prefix = $(ftp-gnu)/GNUinfo/ -fdl.texi-url_prefix = $(ftp-gnu)/GNUinfo/ - -target = $(patsubst get-%,%,$@) -url = $($(notdir $(target))-url_prefix)$(notdir $(target)) - -.PHONY: $(wget-targets) -$(wget-targets): - @echo $(WGET) $(url) -O $(target) \ - && $(WGET) $(url) -O $(target).t \ - && $(move_if_change) - -config-prefix = http://savannah.gnu.org/cgi-bin/viewcvs/config -config-url = $(config-prefix)/$(patsubst get-%,%,$@)?rev=HEAD -get-config/config.guess get-config/config.sub: - @echo $(WGET) $(config-url) -O $(target) \ - && $(WGET) $(config-url) -O $(target).t \ - && $(move_if_change) - - -.PHONY: wget-update -wget-update: $(wget-targets) - - -# Updating tools via CVS. -cvs_files ?= depcomp missing -# config/config.guess config/config.sub -cvs-targets = $(patsubst %, get-%, $(cvs_files)) - -automake_repo = :pserver:anoncvs@anoncvs.cygnus.com:/cvs/automake -.PHONY: $(cvs-targets) -$(cvs-targets): - $(CVS) -d $(automake_repo) co -p automake/lib/$(notdir $(target)) \ - >$(target).t \ - && $(move_if_change) - -.PHONY: cvs-update -cvs-update: $(cvs-targets) get-config/config.guess get-config/config.sub - - -# --------------------- # -# Updating everything. # -# --------------------- # - -.PHONY: update -update: wget-update po-update - -# cvs-update - - -## --------------- ## -## Sanity checks. ## -## --------------- ## - -# Checks that don't require cvs. Run `changelog-check' last as -# previous test may reveal problems requiring new ChangeLog entries. -local-check: po-check changelog-check - -# copyright-check writable-files - -changelog-check: - if head ChangeLog | grep 'Version $(VERSION)' >/dev/null; then \ - :; \ - else \ - echo "$(VERSION) not in ChangeLog" 1>&2; \ - exit 1; \ - fi - -# Verify that all source files using _() are listed in po/POTFILES.in. -# Ignore make.h; it defines _(). -po-check: - if test -f po/POTFILES.in; then \ - grep -E -v '^(#|$$)' po/POTFILES.in | sort > $@-1; \ - grep -E -l '\b_\(' *.c *.h | grep -v make.h | sort > $@-2; \ - diff -u $@-1 $@-2 || exit 1; \ - rm -f $@-1 $@-2; \ - fi diff --git a/src/gmake/make.1 b/src/gmake/make.1 deleted file mode 100644 index 5b096776..00000000 --- a/src/gmake/make.1 +++ /dev/null @@ -1,291 +0,0 @@ -.TH MAKE 1L "22 August 1989" "GNU" "LOCAL USER COMMANDS" -.SH NAME -make \- GNU make utility to maintain groups of programs -.SH SYNOPSIS -.B "make " -[ -.B \-f -.I makefile -] [ option ] ... -target ... -.SH WARNING -This man page is an extract of the documentation of -.I GNU make . -It is updated only occasionally, because the GNU project does not use nroff. -For complete, current documentation, refer to the Info file -.B make.info -which is made from the Texinfo source file -.BR make.texinfo . -.SH DESCRIPTION -.LP -The purpose of the -.I make -utility is to 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 -.IR make , -which was written by Richard Stallman and Roland McGrath. -Our examples show C programs, since they are most common, but you can use -.I make -with any programming language whose compiler can be run with a -shell command. -In fact, -.I 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 -.IR 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 -.I 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 commands recorded in the data base. -.LP -.I 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, -.I 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 -.IR make , -and will not be understood by other versions of -.IR make . -If -.I makefile -is `\-', the standard input is read. -.LP -.I 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 -.B \-b -.TP 0.5i -.B \-m -These options are ignored for compatibility with other versions of -.IR make . -.TP 0.5i -.BI "\-C " dir -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 -.IR 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 -.I make -decides what to do. -.TP 0.5i -.B \-e -Give variables taken from the environment precedence -over variables from makefiles. -.TP 0.5i -.BI "\-f " file -Use -.I file -as a makefile. -.TP 0.5i -.B \-i -Ignore all errors in commands executed to remake files. -.TP 0.5i -.BI "\-I " dir -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 -.IR make , -directories given with -.B \-I -flags may come directly after the flag: -.BI \-I dir -is allowed, as well as -.BI "\-I " dir. -This syntax is allowed for compatibility with the C -preprocessor's -.B \-I -flag. -.TP 0.5i -.BI "\-j " jobs -Specifies the number of 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, -.IR make -will not limit the number of jobs that can run simultaneously. -.TP 0.5i -.B \-k -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 -.B \-l -.TP 0.5i -.BI "\-l " load -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 -.B \-n -Print the commands that would be executed, but do not execute them. -.TP 0.5i -.BI "\-o " file -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 -.B \-p -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 -.B make -.B \-p -.BI \-f /dev/null. -.TP 0.5i -.B \-q -``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 -.B \-r -Eliminate use of the built-in implicit rules. -Also clear out the default list of suffixes for suffix rules. -.TP 0.5i -.B \-s -Silent operation; do not print the commands as they are executed. -.TP 0.5i -.B \-S -Cancel the effect of the -.B \-k -option. -This is never necessary except in a recursive -.I make -where -.B \-k -might be inherited from the top-level -.I make -via MAKEFLAGS or if you set -.B \-k -in MAKEFLAGS in your environment. -.TP 0.5i -.B \-t -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 -.IR make . -.TP 0.5i -.B \-v -Print the version of the -.I make -program plus a copyright, a list of authors and a notice that there -is no warranty. -.TP 0.5i -.B \-w -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 -.I make -commands. -.TP 0.5i -.BI "\-W " file -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 -.IR make , -except that the modification time is changed only in the imagination of -.IR make . -.SH "SEE ALSO" -.I "The GNU Make Manual" -.SH BUGS -See the chapter `Problems and Bugs' in -.I "The GNU Make Manual" . -.SH AUTHOR -This manual page contributed by Dennis Morse of Stanford University. -It has been reworked by Roland McGrath. diff --git a/src/gmake/make.h b/src/gmake/make.h deleted file mode 100644 index 3fae1bff..00000000 --- a/src/gmake/make.h +++ /dev/null @@ -1,593 +0,0 @@ -/* Miscellaneous global declarations and portability cruft for GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, -2002 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* 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 make.h was found in $srcdir). */ -#include -#undef HAVE_CONFIG_H -#define HAVE_CONFIG_H 1 - -/* AIX requires this to be the first thing in the file. */ -#ifndef __GNUC__ -# if HAVE_ALLOCA_H -# include -# else -# ifdef _AIX - #pragma alloca -# else -# ifndef alloca /* predefined by HP cc +Olibcalls */ -char *alloca (); -# endif -# endif -# endif -#endif - - -/* Use prototypes if available. */ -#if defined (__cplusplus) || (defined (__STDC__) && __STDC__) -# undef PARAMS -# define PARAMS(protos) protos -#else /* Not C++ or ANSI C. */ -# undef PARAMS -# define PARAMS(protos) () -#endif /* C++ or ANSI C. */ - -/* Specify we want GNU source code. This must be defined before any - system headers are included. */ - -#define _GNU_SOURCE 1 - - -#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. Does every system have a - ? If any does not, configure should check for it. */ -# 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 = (char *) alloca (GET_PATH_MAX) -extern unsigned int get_path_max PARAMS ((void)); -#endif - -#ifndef CHAR_BIT -# define CHAR_BIT 8 -#endif - -/* Nonzero if the integer type T is signed. */ -#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 -/* 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 - -#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 -extern char *malloc PARAMS ((int)); -extern char *realloc PARAMS ((char *, int)); -extern void free PARAMS ((char *)); - -extern void abort PARAMS ((void)) __attribute__ ((noreturn)); -extern void exit PARAMS ((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 0 -#endif - -#ifdef ANSI_STRING - -# ifndef bcmp -# define bcmp(s1, s2, n) memcmp ((s1), (s2), (n)) -# endif -# ifndef bzero -# define bzero(s, n) memset ((s), 0, (n)) -# endif -# if defined(HAVE_MEMMOVE) && !defined(bcopy) -# define bcopy(s, d, n) memmove ((d), (s), (n)) -# endif - -#else /* Not ANSI_STRING. */ - -# ifndef HAVE_STRCHR -# define strchr(s, c) index((s), (c)) -# define strrchr(s, c) rindex((s), (c)) -# endif - -# ifndef bcmp -extern int bcmp PARAMS ((const char *, const char *, int)); -# endif -# ifndef bzero -extern void bzero PARAMS ((char *, int)); -#endif -# ifndef bcopy -extern void bcopy PARAMS ((const char *b1, char *b2, int)); -# endif - -#endif /* ANSI_STRING. */ -#undef ANSI_STRING - -/* SCO Xenix has a buggy macro definition in . */ -#undef strerror - -#if !defined(ANSI_STRING) && !defined(__DECC) -extern char *strerror PARAMS ((int errnum)); -#endif - -#if HAVE_INTTYPES_H -# include -#endif -#define FILE_TIMESTAMP uintmax_t - -#if !defined(HAVE_STRSIGNAL) -extern char *strsignal PARAMS ((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) - -#ifndef iAPX286 -# define streq(a, b) \ - ((a) == (b) || \ - (*(a) == *(b) && (*(a) == '\0' || !strcmp ((a) + 1, (b) + 1)))) -# ifdef HAVE_CASE_INSENSITIVE_FS -/* This is only used on Windows/DOS platforms, so we assume strcmpi(). */ -# define strieq(a, b) \ - ((a) == (b) \ - || (tolower((unsigned char)*(a)) == tolower((unsigned char)*(b)) \ - && (*(a) == '\0' || !strcmpi ((a) + 1, (b) + 1)))) -# else -# define strieq(a, b) streq(a, b) -# endif -#else -/* Buggy compiler can't handle this. */ -# define streq(a, b) (strcmp ((a), (b)) == 0) -# define strieq(a, b) (strcmp ((a), (b)) == 0) -#endif -#define strneq(a, b, l) (strncmp ((a), (b), (l)) == 0) -#ifdef VMS -extern int strcmpi (const char *,const char *); -#endif - -#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. */ -#if defined(HAVE_DOS_PATHS) -# define PATH_SEPARATOR_CHAR ';' -#elif defined(VMS) -# define PATH_SEPARATOR_CHAR ',' -#else -# define PATH_SEPARATOR_CHAR ':' -#endif - -#ifdef WINDOWS32 -# include -# include -# define pipe(p) _pipe(p, 512, O_BINARY) -# define kill(pid,sig) w32_kill(pid,sig) - -extern void sync_Path_environment(void); -extern int kill(int pid, int sig); -extern int safe_stat(char *file, struct stat *sb); -extern char *end_of_token_w32(char *s, char stopchar); -extern int find_and_set_default_shell(char *token); - -/* indicates whether or not we have Bourne shell */ -extern int no_default_sh_exe; - -/* is default_shell unixy? */ -extern int unixy_shell; -#endif /* WINDOWS32 */ - -struct floc - { - char *filenm; - unsigned long lineno; - }; -#define NILF ((struct floc *)0) - -#define STRING_SIZE_TUPLE(_s) (_s), (sizeof (_s)-1) - - -/* Fancy processing for variadic functions in both ANSI and pre-ANSI - compilers. */ -#if defined __STDC__ && __STDC__ -extern void message (int prefix, const char *fmt, ...) - __attribute__ ((__format__ (__printf__, 2, 3))); -extern void error (const struct floc *flocp, const char *fmt, ...) - __attribute__ ((__format__ (__printf__, 2, 3))); -extern void fatal (const struct floc *flocp, const char *fmt, ...) - __attribute__ ((noreturn, __format__ (__printf__, 2, 3))); -#else -extern void message (); -extern void error (); -extern void fatal (); -#endif - -extern void die PARAMS ((int)) __attribute__ ((noreturn)); -extern void log_working_directory PARAMS ((int)); -extern void pfatal_with_name PARAMS ((const char *)) __attribute__ ((noreturn)); -extern void perror_with_name PARAMS ((const char *, const char *)); -extern char *savestring PARAMS ((const char *, unsigned int)); -extern char *concat PARAMS ((const char *, const char *, const char *)); -extern char *xmalloc PARAMS ((unsigned int)); -extern char *xrealloc PARAMS ((char *, unsigned int)); -extern char *xstrdup PARAMS ((const char *)); -extern char *find_next_token PARAMS ((char **, unsigned int *)); -extern char *next_token PARAMS ((const char *)); -extern char *end_of_token PARAMS ((char *)); -extern void collapse_continuations PARAMS ((char *)); -extern void remove_comments PARAMS((char *)); -extern char *sindex PARAMS ((const char *, unsigned int, \ - const char *, unsigned int)); -extern char *lindex PARAMS ((const char *, const char *, int)); -extern int alpha_compare PARAMS ((const void *, const void *)); -extern void print_spaces PARAMS ((unsigned int)); -extern char *find_char_unquote PARAMS ((char *, int, int, int)); -extern char *find_percent PARAMS ((char *)); -extern FILE *open_tmpfile PARAMS ((char **, const char *)); - -#ifndef NO_ARCHIVES -extern int ar_name PARAMS ((char *)); -extern void ar_parse_name PARAMS ((char *, char **, char **)); -extern int ar_touch PARAMS ((char *)); -extern time_t ar_member_date PARAMS ((char *)); -#endif - -extern int dir_file_exists_p PARAMS ((char *, char *)); -extern int file_exists_p PARAMS ((char *)); -extern int file_impossible_p PARAMS ((char *)); -extern void file_impossible PARAMS ((char *)); -extern char *dir_name PARAMS ((char *)); -extern void hash_init_directories PARAMS ((void)); - -extern void define_default_variables PARAMS ((void)); -extern void set_default_suffixes PARAMS ((void)); -extern void install_default_suffix_rules PARAMS ((void)); -extern void install_default_implicit_rules PARAMS ((void)); - -extern void build_vpath_lists PARAMS ((void)); -extern void construct_vpath_list PARAMS ((char *pattern, char *dirpath)); -extern int vpath_search PARAMS ((char **file, FILE_TIMESTAMP *mtime_ptr)); -extern int gpath_search PARAMS ((char *file, int len)); - -extern void construct_include_path PARAMS ((char **arg_dirs)); - -extern void user_access PARAMS ((void)); -extern void make_access PARAMS ((void)); -extern void child_access PARAMS ((void)); - -#ifdef HAVE_VFORK_H -# include -#endif - -/* We omit these declarations on non-POSIX systems which define _POSIX_VERSION, - because such systems often declare them in header files anyway. */ - -#if !defined (__GNU_LIBRARY__) && !defined (POSIX) && !defined (_POSIX_VERSION) && !defined(WINDOWS32) - -extern long int atol (); -# ifndef VMS -extern long int lseek (); -# endif - -#endif /* Not GNU C library or POSIX. */ - -#ifdef HAVE_GETCWD -# if !defined(VMS) && !defined(__DECC) -extern char *getcwd (); -#endif -#else -extern char *getwd (); -# define getcwd(buf, len) getwd (buf) -#endif - -extern const struct floc *reading_file; - -extern char **environ; - -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; -extern int warn_undefined_variables_flag, posix_pedantic, not_parallel; -extern int clock_skew_detected; - -/* can we run commands via 'sh -c xxx' or must we use batch files? */ -extern int batch_mode_shell; - -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 - -extern char *program; -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 -# define MAKE_SUCCESS 1 -# define MAKE_TROUBLE 2 -# define MAKE_FAILURE 3 -#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 !HAVE_STRCASECMP -# define strcasecmp stricmp -# endif - -# 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; \ - while (((_v)=_c)==0 && errno==EINTR); }while(0) - diff --git a/src/gmake/make.lnk b/src/gmake/make.lnk deleted file mode 100644 index 8fbbeffd..00000000 --- a/src/gmake/make.lnk +++ /dev/null @@ -1,5 +0,0 @@ -FROM LIB:cres.o "commands.o"+"job.o"+"dir.o"+"file.o"+"misc.o"+"main.o"+"read.o"+"remake.o"+"rule.o"+"implicit.o"+"default.o"+"variable.o"+"expand.o"+"function.o"+"vpath.o"+"version.o"+"ar.o"+"arscan.o"+"signame.o"+"remote-stub.o"+"getopt.o"+"getopt1.o"+"alloca.o"+"amiga.o" -TO "make.new" -LIB glob/glob.lib LIB:sc.lib LIB:amiga.lib -QUIET - diff --git a/src/gmake/makefile.com b/src/gmake/makefile.com deleted file mode 100644 index dd94bc32..00000000 --- a/src/gmake/makefile.com +++ /dev/null @@ -1,138 +0,0 @@ -$! -$! Makefile.com - builds GNU Make for VMS -$! -$! P1 is non-empty if you want to link with the VAXCRTL library instead -$! of the shareable executable -$! 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" -$ 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 -$! -$! 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 " + - - "hash implicit job main misc read remake remote-stub rule " + - - "signame variable version vmsfunctions vmsify vpath " + - - "[.glob]glob [.glob]fnmatch getopt1 getopt" -$ 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' 'p1' -$ n = n + 1 -$ goto loop -$ linkit: -$ close optf -$ if p1 .nes. "" then goto link_using_library -$ link/exe=make make.opt/opt'lopt -$ goto cleanup -$ -$ link_using_library: -$ link/exe=make make.opt/opt,sys$library:vaxcrtl/lib'lopt -$ -$ cleanup: -$ if f$trnlnm("SYS").nes."" then $ deassign sys -$ if f$trnlnm("OPTF").nes."" then $ close optf -$ if f$search("make.opt").nes."" then $ del make.opt;* -$ exit -$! -$!------------------------------------------------------------------------------ -$! -$! Check if this is a define relating to the properties of the C/C++ -$! compiler -$! -$CHECK_CC_QUAL: -$ open/write tmpc 'tc -$ ccqual = "/warn=(disable=questcompare)" -$ write tmpc "#include " -$ write tmpc "unsigned int i = 1;" -$ write tmpc "int main(){" -$ write tmpc "if (i < 0){printf(""Mission impossible\n"");}}" -$ close tmpc -$ gosub cc_qual_check -$ return -$! -$!------------------------------------------------------------------------------ -$! -$! Check for properties of C/C++ compiler -$! -$CC_QUAL_CHECK: -$ cc_qual = false -$ set message/nofac/noident/nosever/notext -$ cc 'ccqual' 'tmpnam' -$ if $status then cc_qual = true -$ set message/fac/ident/sever/text -$ delete/nolog 'tmpnam'.*;* -$ if cc_qual then ccopt = ccopt + ccqual -$ return -$!------------------------------------------------------------------------------ -$! -$ compileit : subroutine -$ ploc = f$locate("]",p1) -$ filnam = p1 -$ if ploc .lt. f$length(p1) then filnam=f$extract(ploc+1,100,p1) -$ write optf "''filnam'" -$ cc'ccopt'/include=([],[.glob]) - - /define=("allocated_variable_expand_for_file=alloc_var_expand_for_file","unlink=remove","HAVE_CONFIG_H","VMS") - - 'p1' -$ exit -$ endsubroutine : compileit diff --git a/src/gmake/makefile.vms b/src/gmake/makefile.vms deleted file mode 100644 index 3ada8314..00000000 --- a/src/gmake/makefile.vms +++ /dev/null @@ -1,147 +0,0 @@ -# Copyright (C) 1988, 1989, 1996, 1997 Free Software Foundation, Inc. -# This file is part of GNU Make. -# -# 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 -# -# GNU Make is free software; you can 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. -# -# GNU Make is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Make; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -# Boston, MA 02111-1307, USA. - -CC = cc -CP = copy - -%.obj: %.c - $(CC) $(CFLAGS)/obj=$@ $< -# -# Makefile for GNU Make -# - -ifeq ($(CC),cc) -CFLAGS = $(defines) /include=([],[.glob])/prefix=all/standard=relaxed -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 - -objs = commands.obj,job.obj,dir.obj,file.obj,misc.obj,hash.obj,\ - main.obj,read.obj,remake.obj,rule.obj,implicit.obj,\ - default.obj,variable.obj,expand.obj,function.obj,\ - vpath.obj,version.obj$(ARCHIVES)$(ALLOCA)$(extras)$(getopt)$(glob) -srcs = commands.c job.c dir.c file.c misc.c hash.c\ - main.c read.c remake.c rule.c implicit.c \ - default.c variable.c expand.c function.c \ - vpath.c version.c vmsfunctions.c vmsify.c $(ARCHIVES_SRC) $(ALLOCASRC) \ - commands.h dep.h filedef.h job.h make.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) *.opt; - -$(RM) [.glob]*.obj; - -# Automatically generated dependencies. -commands.obj: commands.c make.h dep.h commands.h filedef.h variable.h job.h -job.obj: job.c make.h commands.h job.h filedef.h variable.h -dir.obj: dir.c make.h -file.obj: file.c make.h commands.h dep.h filedef.h variable.h -misc.obj: misc.c make.h dep.h -hash.obj: hash.c make.h hash.h -main.obj: main.c make.h commands.h dep.h filedef.h variable.h job.h -read.obj: read.c make.h commands.h dep.h filedef.h variable.h -remake.obj: remake.c make.h commands.h job.h dep.h filedef.h -rule.obj: rule.c make.h commands.h dep.h filedef.h variable.h rule.h -implicit.obj: implicit.c make.h rule.h dep.h filedef.h -default.obj: default.c make.h rule.h dep.h filedef.h commands.h variable.h -variable.obj: variable.c make.h commands.h variable.h dep.h filedef.h -expand.obj: expand.c make.h commands.h filedef.h variable.h -function.obj: function.c make.h variable.h dep.h commands.h job.h -vpath.obj: vpath.c make.h filedef.h variable.h -version.obj: version.c config.h -arscan.obj: arscan.c -ar.obj: ar.c make.h filedef.h -signame.obj: signame.c -remote-stub.obj: remote-stub.c -[.glob]glob.obj: [.glob]glob.c -[.glob]fnmatch.obj: [.glob]fnmatch.c -getopt.obj: getopt.c -getopt1.obj: getopt1.c -vmsfunctions.obj: vmsfunctions.c make.h vmsdir.h -vmsify.obj: vmsify.c make.h - -config.h: config.h-vms - $(CP) $< $@ diff --git a/src/gmake/misc.c b/src/gmake/misc.c deleted file mode 100644 index ef754e50..00000000 --- a/src/gmake/misc.c +++ /dev/null @@ -1,830 +0,0 @@ -/* Miscellaneous generic support functions for GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1997, -2002 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" -#include "dep.h" -#include "debug.h" - -/* Variadic functions. We go through contortions to allow proper function - prototypes for both ANSI and pre-ANSI C compilers, and also for those - which support stdarg.h vs. varargs.h, and finally those which have - vfprintf(), etc. and those who have _doprnt... or nothing. - - This fancy stuff all came from GNU fileutils, except for the VA_PRINTF and - VA_END macros used here since we have multiple print functions. */ - -#if HAVE_VPRINTF || HAVE_DOPRNT -# define HAVE_STDVARARGS 1 -# if __STDC__ -# include -# define VA_START(args, lastarg) va_start(args, lastarg) -# else -# include -# define VA_START(args, lastarg) va_start(args) -# endif -# if HAVE_VPRINTF -# define VA_PRINTF(fp, lastarg, args) vfprintf((fp), (lastarg), (args)) -# else -# define VA_PRINTF(fp, lastarg, args) _doprnt((lastarg), (args), (fp)) -# endif -# define VA_END(args) va_end(args) -#else -/* # undef HAVE_STDVARARGS */ -# define va_alist a1, a2, a3, a4, a5, a6, a7, a8 -# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8; -# define VA_START(args, lastarg) -# define VA_PRINTF(fp, lastarg, args) fprintf((fp), (lastarg), va_alist) -# define VA_END(args) -#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) -{ - register char *in, *out, *p; - register int backslash; - register unsigned int bs_write; - - 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. */ - backslash = 0; - 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 the newline is quoted, discard following whitespace - and any preceding whitespace; leave just one space. */ - if (backslash) - { - in = next_token (in); - 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'; -} - - -/* Remove comments from LINE. - This is done by copying the text at LINE onto itself. */ - -void -remove_comments (char *line) -{ - char *comment; - - comment = find_char_unquote (line, '#', 0, 0); - - if (comment != 0) - /* Cut off the line at the #. */ - *comment = '\0'; -} - -/* Print N spaces (used in debug for target-depth). */ - -void -print_spaces (unsigned int n) -{ - while (n-- > 0) - putchar (' '); -} - - -/* Return a newly-allocated string whose contents - concatenate those of s1, s2, s3. */ - -char * -concat (const char *s1, const char *s2, const char *s3) -{ - unsigned int len1, len2, len3; - char *result; - - len1 = *s1 != '\0' ? strlen (s1) : 0; - len2 = *s2 != '\0' ? strlen (s2) : 0; - len3 = *s3 != '\0' ? strlen (s3) : 0; - - result = (char *) xmalloc (len1 + len2 + len3 + 1); - - if (*s1 != '\0') - bcopy (s1, result, len1); - if (*s2 != '\0') - bcopy (s2, result + len1, len2); - if (*s3 != '\0') - bcopy (s3, result + len1 + len2, len3); - *(result + len1 + len2 + len3) = '\0'; - - return result; -} - -/* Print a message on stdout. */ - -void -#if __STDC__ && HAVE_STDVARARGS -message (int prefix, const char *fmt, ...) -#else -message (prefix, fmt, va_alist) - int prefix; - const char *fmt; - va_dcl -#endif -{ -#if HAVE_STDVARARGS - va_list args; -#endif - - log_working_directory (1); - - if (fmt != 0) - { - if (prefix) - { - if (makelevel == 0) - printf ("%s: ", program); - else - printf ("%s[%u]: ", program, makelevel); - } - VA_START (args, fmt); - VA_PRINTF (stdout, fmt, args); - VA_END (args); - putchar ('\n'); - } - - fflush (stdout); -} - -/* Print an error message. */ - -void -#if __STDC__ && HAVE_STDVARARGS -error (const struct floc *flocp, const char *fmt, ...) -#else -error (flocp, fmt, va_alist) - const struct floc *flocp; - const char *fmt; - va_dcl -#endif -{ -#if HAVE_STDVARARGS - va_list args; -#endif - - log_working_directory (1); - - if (flocp && flocp->filenm) - fprintf (stderr, "%s:%lu: ", flocp->filenm, flocp->lineno); - else if (makelevel == 0) - fprintf (stderr, "%s: ", program); - else - fprintf (stderr, "%s[%u]: ", program, makelevel); - - VA_START(args, fmt); - VA_PRINTF (stderr, fmt, args); - VA_END (args); - - putc ('\n', stderr); - fflush (stderr); -} - -/* Print an error message and exit. */ - -void -#if __STDC__ && HAVE_STDVARARGS -fatal (const struct floc *flocp, const char *fmt, ...) -#else -fatal (flocp, fmt, va_alist) - const struct floc *flocp; - const char *fmt; - va_dcl -#endif -{ -#if HAVE_STDVARARGS - va_list args; -#endif - - log_working_directory (1); - - if (flocp && flocp->filenm) - fprintf (stderr, "%s:%lu: *** ", flocp->filenm, flocp->lineno); - else if (makelevel == 0) - fprintf (stderr, "%s: *** ", program); - else - fprintf (stderr, "%s[%u]: *** ", program, makelevel); - - VA_START(args, fmt); - VA_PRINTF (stderr, fmt, args); - VA_END (args); - - fputs (_(". Stop.\n"), stderr); - - die (2); -} - -#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 - -/* Print an error message from errno. */ - -void -perror_with_name (const char *str, const char *name) -{ - error (NILF, _("%s%s: %s"), str, name, strerror (errno)); -} - -/* Print an error message from errno and exit. */ - -void -pfatal_with_name (const char *name) -{ - fatal (NILF, _("%s: %s"), name, strerror (errno)); - - /* NOTREACHED */ -} - -/* 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 xrealloc -#undef xstrdup - -char * -xmalloc (unsigned int size) -{ - char *result = (char *) malloc (size); - if (result == 0) - fatal (NILF, _("virtual memory exhausted")); - return result; -} - - -char * -xrealloc (char *ptr, unsigned int size) -{ - char *result; - - /* Some older implementations of realloc() don't conform to ANSI. */ - result = ptr ? realloc (ptr, size) : malloc (size); - if (result == 0) - fatal (NILF, _("virtual memory exhausted")); - return result; -} - - -char * -xstrdup (const char *ptr) -{ - char *result; - -#ifdef HAVE_STRDUP - result = strdup (ptr); -#else - result = (char *) malloc (strlen (ptr) + 1); -#endif - - if (result == 0) - fatal (NILF, _("virtual memory exhausted")); - -#ifdef HAVE_STRDUP - return result; -#else - return strcpy(result, ptr); -#endif -} - -#endif /* HAVE_DMALLOC_H */ - -char * -savestring (const char *str, unsigned int length) -{ - register char *out = (char *) xmalloc (length + 1); - if (length > 0) - bcopy (str, out, length); - out[length] = '\0'; - return out; -} - -/* Search string BIG (length BLEN) for an occurrence of - string SMALL (length SLEN). Return a pointer to the - beginning of the first occurrence, or return nil if none found. */ - -char * -sindex (const char *big, unsigned int blen, - const char *small, unsigned int slen) -{ - if (!blen) - blen = strlen (big); - if (!slen) - slen = strlen (small); - - if (slen && blen >= slen) - { - register unsigned int b; - - /* Quit when there's not enough room left for the small string. */ - --slen; - blen -= slen; - - for (b = 0; b < blen; ++b, ++big) - if (*big == *small && strneq (big + 1, small + 1, slen)) - return (char *)big; - } - - return 0; -} - -/* 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 (char *s) -{ - while (*s != '\0' && !isblank ((unsigned char)*s)) - ++s; - return s; -} - -#ifdef WINDOWS32 -/* - * Same as end_of_token, but take into account a stop character - */ -char * -end_of_token_w32 (char *s, char stopchar) -{ - register char *p = s; - register int backslash = 0; - - while (*p != '\0' && *p != stopchar - && (backslash || !isblank ((unsigned char)*p))) - { - if (*p++ == '\\') - { - backslash = !backslash; - while (*p == '\\') - { - backslash = !backslash; - ++p; - } - } - else - backslash = 0; - } - - return p; -} -#endif - -/* 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. */ - -char * -find_next_token (char **ptr, unsigned int *lengthptr) -{ - char *p = next_token (*ptr); - char *end; - - if (*p == '\0') - return 0; - - *ptr = end = end_of_token (p); - if (lengthptr != 0) - *lengthptr = end - p; - return p; -} - -/* Copy a chain of `struct dep', making a new chain - with the same contents as the old one. */ - -struct dep * -copy_dep_chain (struct dep *d) -{ - register struct dep *c; - struct dep *firstnew = 0; - struct dep *lastnew = 0; - - while (d != 0) - { - c = (struct dep *) xmalloc (sizeof (struct dep)); - bcopy ((char *) d, (char *) c, sizeof (struct dep)); - if (c->name != 0) - c->name = xstrdup (c->name); - c->next = 0; - if (firstnew == 0) - firstnew = lastnew = c; - else - lastnew = lastnew->next = c; - - d = d->next; - } - - return firstnew; -} - -#ifdef iAPX286 -/* The losing compiler on this machine can't handle this macro. */ - -char * -dep_name (struct dep *dep) -{ - return dep->name == 0 ? dep->file->name : dep->name; -} -#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 (char *flavor) -{ - if (! ISDB (DB_JOBS)) - return; - - /* All the other debugging messages go to stdout, - but we write this one to stderr because it might be - run in a child fork whose stdout is piped. */ - - fprintf (stderr, _("%s: user %lu (real %lu), group %lu (real %lu)\n"), - flavor, (unsigned long) geteuid (), (unsigned long) getuid (), - (unsigned long) getegid (), (unsigned long) getgid ()); - fflush (stderr); -} - - -static void -init_access (void) -{ -#ifndef VMS - user_uid = getuid (); - user_gid = getgid (); - - make_uid = geteuid (); - make_gid = getegid (); - - /* Do these ever fail? */ - if (user_uid == -1 || user_gid == -1 || make_uid == -1 || make_gid == -1) - pfatal_with_name ("get{e}[gu]id"); - - log_access (_("Initialized access")); - - current_access = make; -#endif -} - -#endif /* GETLOADAVG_PRIVILEGED */ - -/* Give the process appropriate permissions for access to - user data (i.e., to stat files, or to spawn a child process). */ -void -user_access (void) -{ -#ifdef GETLOADAVG_PRIVILEGED - - if (!access_inited) - init_access (); - - if (current_access == user) - return; - - /* We are in "make access" mode. This means that the effective user and - group IDs are those of make (if it was installed setuid or setgid). - We now want to set the effective user and group IDs to the real IDs, - which are the IDs of the process that exec'd make. */ - -#ifdef HAVE_SETEUID - - /* Modern systems have the seteuid/setegid calls which set only the - effective IDs, which is ideal. */ - - if (seteuid (user_uid) < 0) - pfatal_with_name ("user_access: seteuid"); - -#else /* Not HAVE_SETEUID. */ - -#ifndef HAVE_SETREUID - - /* System V has only the setuid/setgid calls to set user/group IDs. - There is an effective ID, which can be set by setuid/setgid. - It can be set (unless you are root) only to either what it already is - (returned by geteuid/getegid, now in make_uid/make_gid), - the real ID (return by getuid/getgid, now in user_uid/user_gid), - or the saved set ID (what the effective ID was before this set-ID - executable (make) was exec'd). */ - - if (setuid (user_uid) < 0) - pfatal_with_name ("user_access: setuid"); - -#else /* HAVE_SETREUID. */ - - /* In 4BSD, the setreuid/setregid calls set both the real and effective IDs. - They may be set to themselves or each other. So you have two alternatives - at any one time. If you use setuid/setgid, the effective will be set to - the real, leaving only one alternative. Using setreuid/setregid, however, - you can toggle between your two alternatives by swapping the values in a - single setreuid or setregid call. */ - - if (setreuid (make_uid, user_uid) < 0) - pfatal_with_name ("user_access: setreuid"); - -#endif /* Not HAVE_SETREUID. */ -#endif /* HAVE_SETEUID. */ - -#ifdef HAVE_SETEGID - if (setegid (user_gid) < 0) - pfatal_with_name ("user_access: setegid"); -#else -#ifndef HAVE_SETREGID - if (setgid (user_gid) < 0) - pfatal_with_name ("user_access: setgid"); -#else - if (setregid (make_gid, user_gid) < 0) - pfatal_with_name ("user_access: setregid"); -#endif -#endif - - current_access = user; - - log_access (_("User access")); - -#endif /* GETLOADAVG_PRIVILEGED */ -} - -/* Give the process appropriate permissions for access to - make data (i.e., the load average). */ -void -make_access (void) -{ -#ifdef GETLOADAVG_PRIVILEGED - - if (!access_inited) - init_access (); - - if (current_access == make) - return; - - /* See comments in user_access, above. */ - -#ifdef HAVE_SETEUID - if (seteuid (make_uid) < 0) - pfatal_with_name ("make_access: seteuid"); -#else -#ifndef HAVE_SETREUID - if (setuid (make_uid) < 0) - pfatal_with_name ("make_access: setuid"); -#else - if (setreuid (user_uid, make_uid) < 0) - pfatal_with_name ("make_access: setreuid"); -#endif -#endif - -#ifdef HAVE_SETEGID - if (setegid (make_gid) < 0) - pfatal_with_name ("make_access: setegid"); -#else -#ifndef HAVE_SETREGID - if (setgid (make_gid) < 0) - pfatal_with_name ("make_access: setgid"); -#else - if (setregid (user_gid, make_gid) < 0) - pfatal_with_name ("make_access: setregid"); -#endif -#endif - - current_access = make; - - log_access (_("Make access")); - -#endif /* GETLOADAVG_PRIVILEGED */ -} - -/* Give the process appropriate permissions for a child process. - This is like user_access, but you can't get back to make_access. */ -void -child_access (void) -{ -#ifdef GETLOADAVG_PRIVILEGED - - if (!access_inited) - abort (); - - /* Set both the real and effective UID and GID to the user's. - They cannot be changed back to make's. */ - -#ifndef HAVE_SETREUID - if (setuid (user_uid) < 0) - pfatal_with_name ("child_access: setuid"); -#else - if (setreuid (user_uid, user_uid) < 0) - pfatal_with_name ("child_access: setreuid"); -#endif - -#ifndef HAVE_SETREGID - if (setgid (user_gid) < 0) - pfatal_with_name ("child_access: setgid"); -#else - if (setregid (user_gid, user_gid) < 0) - pfatal_with_name ("child_access: setregid"); -#endif - - log_access (_("Child access")); - -#endif /* GETLOADAVG_PRIVILEGED */ -} - -#ifdef NEED_GET_PATH_MAX -unsigned int -get_path_max (void) -{ - static unsigned int value; - - if (value == 0) - { - long int x = pathconf ("/", _PC_PATH_MAX); - if (x > 0) - value = x; - else - return MAXPATHLEN; - } - - return value; -} -#endif diff --git a/src/gmake/po/.cvsignore b/src/gmake/po/.cvsignore deleted file mode 100644 index d01e6b30..00000000 --- a/src/gmake/po/.cvsignore +++ /dev/null @@ -1,6 +0,0 @@ -*.gmo *.mo *.pot *.po - -Makefile Makefile.in Makefile.in.in -Rules-quot -*.sed *.sin *.header -POTFILES diff --git a/src/gmake/po/ChangeLog b/src/gmake/po/ChangeLog deleted file mode 100644 index 9d83d219..00000000 --- a/src/gmake/po/ChangeLog +++ /dev/null @@ -1,29 +0,0 @@ -2003-10-18 Paul D. Smith - - * LINGUAS: Added a new translation for Belarusian (be). - -2002-12-19 Paul D. Smith - - * LINGUAS: Added a new translation for Ukrainian (uk). - -2002-10-05 Paul D. Smith - - * POTFILES.in: Add variable.h as it has a translatable string. - -2002-08-08 Paul D. Smith - - * LINGUAS: Add a new translation for Chinese (simplified) (zh_CN). - -2002-08-02 Paul D. Smith - - * LINGUAS: Add a new translation for Swedish (sv). - -2002-04-21 Paul D. Smith - - * LINGUAS, hr.po: Added new translation: Croatian. - - * da.po, de.po, es.po, fr.po, gl.po, he.po, ja.po, ko.po, nl.po, - pl.po, pt_BR.po, ru.po, tr.po: Moved from i18n to here. - * .cvsignore: Moved from i18n to here. - - * POTFILES.in, LINGUAS, Makevars: Created. diff --git a/src/gmake/po/LINGUAS b/src/gmake/po/LINGUAS deleted file mode 100644 index 92423dd1..00000000 --- a/src/gmake/po/LINGUAS +++ /dev/null @@ -1,5 +0,0 @@ -# Set of available languages: 16 languages - -be da de es fr gl he hr ja ko nl pl pt_BR sv ru tr uk zh_CN - -# Can't seem to get en@quot and en@boldquot to build properly? diff --git a/src/gmake/po/Makevars b/src/gmake/po/Makevars deleted file mode 100644 index 1072d3ea..00000000 --- a/src/gmake/po/Makevars +++ /dev/null @@ -1,41 +0,0 @@ -# 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/src/gmake/po/POTFILES.in b/src/gmake/po/POTFILES.in deleted file mode 100644 index 30b7864b..00000000 --- a/src/gmake/po/POTFILES.in +++ /dev/null @@ -1,25 +0,0 @@ -# List of source files containing translatable strings. -# Copyright (C) 2002 Free Software Foundation, Inc. - -ar.c -arscan.c -commands.c -dir.c -expand.c -file.c -function.c -getopt.c -hash.c -implicit.c -job.c -main.c -misc.c -read.c -remake.c -remote-cstms.c -rule.c -signame.c -variable.c -variable.h -vmsfunctions.c -vpath.c diff --git a/src/gmake/read.c b/src/gmake/read.c deleted file mode 100644 index d79895e1..00000000 --- a/src/gmake/read.c +++ /dev/null @@ -1,3112 +0,0 @@ -/* Reading and parsing of makefiles for GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, -2002 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" - -#include - -#include - -#include "dep.h" -#include "filedef.h" -#include "job.h" -#include "commands.h" -#include "variable.h" -#include "rule.h" -#include "debug.h" -#include "hash.h" - - -#ifndef WINDOWS32 -#ifndef _AMIGA -#ifndef VMS -#include -#else -struct passwd *getpwnam PARAMS ((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. */ - struct floc floc; /* Info on the file in fp (if any). */ - }; - -/* 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 interepreting? */ - 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 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 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 struct floc *reading_file = 0; - -/* The chain of makefiles read by read_makefile. */ - -static struct dep *read_makefiles = 0; - -static int eval_makefile PARAMS ((char *filename, int flags)); -static int eval PARAMS ((struct ebuffer *buffer, int flags)); - -static long readline PARAMS ((struct ebuffer *ebuf)); -static void do_define PARAMS ((char *name, unsigned int namelen, - enum variable_origin origin, - struct ebuffer *ebuf)); -static int conditional_line PARAMS ((char *line, const struct floc *flocp)); -static void record_files PARAMS ((struct nameseq *filenames, char *pattern, char *pattern_percent, - struct dep *deps, unsigned int cmds_started, char *commands, - unsigned int commands_idx, int two_colon, - int have_sysv_atvar, - const struct floc *flocp, int set_default)); -static void record_target_var PARAMS ((struct nameseq *filenames, char *defn, - int two_colon, - enum variable_origin origin, - int enabled, - const struct floc *flocp)); -static enum make_word_type get_next_mword PARAMS ((char *buffer, char *delim, - char **startp, unsigned int *length)); - -/* Read in all the makefiles and return the chain of their names. */ - -struct dep * -read_all_makefiles (char **makefiles) -{ - unsigned int num_makefiles = 0; - - /* Create *_LIST variables, to hold the makefiles, targets, and variables - we will be reading. */ - - define_variable ("MAKEFILE_LIST", sizeof ("MAKEFILE_LIST")-1, "", 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 (&p, &length)) != 0) - { - if (*p != '\0') - *p++ = '\0'; - name = xstrdup (name); - if (eval_makefile (name, - RM_NO_DEFAULT_GOAL|RM_INCLUDED|RM_DONTCARE) < 2) - free (name); - } - - free (value); - } - - /* Read makefiles specified with -f switches. */ - - if (makefiles != 0) - while (*makefiles != 0) - { - struct dep *tail = read_makefiles; - register struct dep *d; - - if (! eval_makefile (*makefiles, 0)) - perror_with_name ("", *makefiles); - - /* Find the right element of read_makefiles. */ - d = read_makefiles; - while (d->next != tail) - d = d->next; - - /* Use the storage read_makefile allocates. */ - *makefiles = dep_name (d); - ++num_makefiles; - ++makefiles; - } - - /* If there were no -f switches, try the default names. */ - - if (num_makefiles == 0) - { - static 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 */ - { "GNUmakefile", "makefile", "Makefile", 0 }; -#endif /* AMIGA */ -#endif /* VMS */ - register 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_makefiles' chain so they will be updated if possible. */ - struct dep *tail = read_makefiles; - /* 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 = (struct dep *) xmalloc (sizeof (struct dep)); - d->name = 0; - d->file = enter_file (*p); - d->file->dontcare = 1; - d->ignore_mtime = 0; - /* 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_makefiles = d; - else - tail->next = d; - tail = d; - } - if (tail != 0) - tail->next = 0; - } - } - - return read_makefiles; -} - -/* Install a new conditional and return the previous one. */ - -static struct conditionals * -install_conditionals (struct conditionals *new) -{ - struct conditionals *save = conditionals; - - bzero ((char *) new, 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. */ - if (conditionals->ignoring) - free (conditionals->ignoring); - if (conditionals->seen_else) - free (conditionals->seen_else); - - /* Restore state. */ - conditionals = saved; -} - -static int -eval_makefile (char *filename, int flags) -{ - struct dep *deps; - struct ebuffer ebuf; - const struct floc *curfile; - int makefile_errno; - int r; - - ebuf.floc.filenm = filename; - 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] == '~') - { - char *expanded = tilde_expand (filename); - if (expanded != 0) - filename = expanded; - } - - ebuf.fp = fopen (filename, "r"); - /* Save the error code so we print the right message later. */ - makefile_errno = errno; - - /* 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 != '/') - { - register unsigned int i; - for (i = 0; include_directories[i] != 0; ++i) - { - char *name = concat (include_directories[i], "/", filename); - ebuf.fp = fopen (name, "r"); - if (ebuf.fp == 0) - free (name); - else - { - filename = name; - break; - } - } - } - - /* Add FILENAME to the chain of read makefiles. */ - deps = (struct dep *) xmalloc (sizeof (struct dep)); - deps->next = read_makefiles; - read_makefiles = deps; - deps->name = 0; - deps->file = lookup_file (filename); - if (deps->file == 0) - { - deps->file = enter_file (xstrdup (filename)); - if (flags & RM_DONTCARE) - deps->file->dontcare = 1; - } - if (filename != ebuf.floc.filenm) - free (filename); - filename = deps->file->name; - deps->changed = flags; - deps->ignore_mtime = 0; - - /* 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; - } - - /* 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; - - r = eval (&ebuf, !(flags & RM_NO_DEFAULT_GOAL)); - - reading_file = curfile; - - fclose (ebuf.fp); - - free (ebuf.bufstart); - return r; -} - -int -eval_buffer (char *buffer) -{ - struct ebuffer ebuf; - struct conditionals *saved; - struct conditionals new; - const struct floc *curfile; - int r; - - /* Evaluate the buffer */ - - ebuf.size = strlen (buffer); - ebuf.buffer = ebuf.bufnext = ebuf.bufstart = buffer; - ebuf.fp = NULL; - - ebuf.floc = *reading_file; - - curfile = reading_file; - reading_file = &ebuf.floc; - - saved = install_conditionals (&new); - - r = eval (&ebuf, 1); - - restore_conditionals (saved); - - reading_file = curfile; - - return r; -} - - -/* 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 int -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. */ - int have_sysv_atvar = 0; - struct nameseq *filenames = 0; - struct dep *deps = 0; - long nlines = 0; - int two_colon = 0; - char *pattern = 0, *pattern_percent; - struct floc *fstart; - struct floc fi; - -#define record_waiting_files() \ - do \ - { \ - if (filenames != 0) \ - { \ - fi.lineno = tgts_started; \ - record_files (filenames, pattern, pattern_percent, deps, \ - cmds_started, commands, commands_idx, two_colon, \ - have_sysv_atvar, &fi, set_default); \ - } \ - filenames = 0; \ - commands_idx = 0; \ - no_targets = 0; \ - if (pattern) { free(pattern); 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 _without_ ending any rule that we happen to be working - with at the moment. If you see a "goto rule_complete", then the - statement we just parsed also finishes the previous rule. */ - - commands = xmalloc (200); - - while (1) - { - int linelen; - char *line; - int len; - char *p; - char *p2; - - /* 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; - - /* If this line is empty, skip it. */ - line = ebuf->buffer; - if (line[0] == '\0') - continue; - - linelen = strlen (line); - - /* Check for a shell command line first. - If it is not one, we can stop treating tab specially. */ - if (line[0] == '\t') - { - 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 tab character. - 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; - - /* Append this command line to the line being accumulated. */ - if (commands_idx == 0) - cmds_started = ebuf->floc.lineno; - - if (linelen + 1 + commands_idx > commands_len) - { - commands_len = (linelen + 1 + commands_idx) * 2; - commands = xrealloc (commands, commands_len); - } - bcopy (line, &commands[commands_idx], linelen); - commands_idx += linelen; - commands[commands_idx++] = '\n'; - - continue; - } - } - - /* This line is not a shell command line. Don't worry about tabs. - 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; - if (collapsed) - free ((char *)collapsed); - collapsed = (char *) xmalloc (collapsed_length); - } - strcpy (collapsed, line); - /* Collapse continuation lines. */ - collapse_continuations (collapsed); - remove_comments (collapsed); - - /* Compare a word, both length and contents. */ -#define word1eq(s) (len == sizeof(s)-1 && strneq (s, p, sizeof(s)-1)) - p = collapsed; - while (isspace ((unsigned char)*p)) - ++p; - - if (*p == '\0') - /* This line is completely empty--ignore it. */ - continue; - - /* Find the end of the first token. Note we don't need to worry about - * ":" here since we compare tokens by length (so "export" will never - * be equal to "export:"). - */ - for (p2 = p+1; *p2 != '\0' && !isspace ((unsigned char)*p2); ++p2) - ; - len = p2 - p; - - /* Find the start of the second token. If it looks like a target or - variable definition it can't be a preprocessor token so skip - them--this allows variables/targets named `ifdef', `export', etc. */ - while (isspace ((unsigned char)*p2)) - ++p2; - - if ((p2[0] == ':' || p2[0] == '+' || p2[0] == '=') && p2[1] == '\0') - { - /* It can't be a preprocessor token so skip it if we're ignoring */ - if (ignoring) - continue; - - goto skip_conditionals; - } - - /* We must first check for conditional and `define' directives before - ignoring anything, since they control what we will do with - following lines. */ - - if (!in_ignored_define - && (word1eq ("ifdef") || word1eq ("ifndef") - || word1eq ("ifeq") || word1eq ("ifneq") - || word1eq ("else") || word1eq ("endif"))) - { - int i = conditional_line (p, fstart); - if (i < 0) - fatal (fstart, _("invalid syntax in conditional")); - - ignoring = i; - continue; - } - - if (word1eq ("endef")) - { - if (!in_ignored_define) - fatal (fstart, _("extraneous `endef'")); - in_ignored_define = 0; - continue; - } - - if (word1eq ("define")) - { - if (ignoring) - in_ignored_define = 1; - else - { - if (*p2 == '\0') - fatal (fstart, _("empty variable name")); - - /* Let the variable name be the whole rest of the line, - with trailing blanks stripped (comments have already been - removed), so it could be a complex variable/function - reference that might contain blanks. */ - p = strchr (p2, '\0'); - while (isblank ((unsigned char)p[-1])) - --p; - do_define (p2, p - p2, o_file, ebuf); - } - continue; - } - - if (word1eq ("override")) - { - if (*p2 == '\0') - error (fstart, _("empty `override' directive")); - - if (strneq (p2, "define", 6) - && (isblank ((unsigned char)p2[6]) || p2[6] == '\0')) - { - if (ignoring) - in_ignored_define = 1; - else - { - p2 = next_token (p2 + 6); - if (*p2 == '\0') - fatal (fstart, _("empty variable name")); - - /* Let the variable name be the whole rest of the line, - with trailing blanks stripped (comments have already been - removed), so it could be a complex variable/function - reference that might contain blanks. */ - p = strchr (p2, '\0'); - while (isblank ((unsigned char)p[-1])) - --p; - do_define (p2, p - p2, o_override, ebuf); - } - } - else if (!ignoring - && !try_variable_definition (fstart, p2, o_override, 0)) - error (fstart, _("invalid `override' directive")); - - continue; - } - - if (ignoring) - /* Ignore the line. We continue here so conditionals - can appear in the middle of a rule. */ - continue; - - if (word1eq ("export")) - { - /* 'export' by itself causes everything to be exported. */ - if (*p2 == '\0') - export_all_variables = 1; - else - { - struct variable *v; - - v = try_variable_definition (fstart, p2, o_file, 0); - if (v != 0) - v->export = v_export; - else - { - unsigned int len; - char *ap; - - /* Expand the line so we can use indirect and constructed - variable names in an export command. */ - p2 = ap = allocated_variable_expand (p2); - - for (p = find_next_token (&p2, &len); p != 0; - p = find_next_token (&p2, &len)) - { - v = lookup_variable (p, len); - if (v == 0) - v = define_variable_loc (p, len, "", o_file, 0, - fstart); - v->export = v_export; - } - - free (ap); - } - } - goto rule_complete; - } - - if (word1eq ("unexport")) - { - if (*p2 == '\0') - export_all_variables = 0; - else - { - unsigned int len; - struct variable *v; - char *ap; - - /* Expand the line so we can use indirect and constructed - variable names in an unexport command. */ - p2 = ap = allocated_variable_expand (p2); - - for (p = find_next_token (&p2, &len); p != 0; - p = find_next_token (&p2, &len)) - { - v = lookup_variable (p, len); - if (v == 0) - v = define_variable_loc (p, len, "", o_file, 0, fstart); - - v->export = v_noexport; - } - - free (ap); - } - goto rule_complete; - } - - skip_conditionals: - if (word1eq ("vpath")) - { - char *pattern; - unsigned int len; - p2 = variable_expand (p2); - p = find_next_token (&p2, &len); - if (p != 0) - { - pattern = savestring (p, len); - p = find_next_token (&p2, &len); - /* No searchpath means remove all previous - selective VPATH's with the same pattern. */ - } - else - /* No pattern means remove all previous selective VPATH's. */ - pattern = 0; - construct_vpath_list (pattern, p); - if (pattern != 0) - free (pattern); - - goto rule_complete; - } - - 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'); - - p = allocated_variable_expand (p2); - if (*p == '\0') - { - error (fstart, - _("no file name for `%sinclude'"), noerror ? "-" : ""); - continue; - } - - /* Parse the list of file names. */ - p2 = p; - files = multi_glob (parse_file_seq (&p2, '\0', - sizeof (struct nameseq), - 1), - sizeof (struct nameseq)); - 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; - char *name = files->name; - int r; - - free ((char *)files); - files = next; - - r = eval_makefile (name, (RM_INCLUDED | RM_NO_TILDE - | (noerror ? RM_DONTCARE : 0))); - if (!r) - { - if (!noerror) - error (fstart, "%s: %s", name, strerror (errno)); - free (name); - } - } - - /* Restore conditional state. */ - restore_conditionals (save); - - goto rule_complete; - } - - if (try_variable_definition (fstart, p, o_file, 0)) - /* This line has been dealt with. */ - goto rule_complete; - - if (line[0] == '\t') - { - p = collapsed; /* Ignore comments, etc. */ - while (isblank ((unsigned char)*p)) - ++p; - if (*p == '\0') - /* The line is completely blank; that is harmless. */ - 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. */ - fatal(fstart, _("commands commence 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; - enum variable_origin v_origin; - int exported; - char *cmdleft, *semip, *lb_next; - unsigned int len, plen = 0; - char *colonp; - - /* 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, ';', '#', 0); - 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, &len); - switch (wtype) - { - case w_eol: - if (cmdleft != 0) - fatal(fstart, _("missing rule before commands")); - /* 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, len); - while (1) - { - lb_next += len; - if (cmdleft == 0) - { - /* Look for a semicolon in the expanded line. */ - cmdleft = find_char_unquote (p2, ';', 0, 0); - - 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-compatiblity. 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, ':', 0, 0); -#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, ':', 0, 0); -#endif - if (colonp != 0) - break; - - wtype = get_next_mword(lb_next, NULL, &lb_next, &len); - if (wtype == w_eol) - break; - - p2 += strlen(p2); - *(p2++) = ' '; - p2 = variable_expand_string(p2, lb_next, len); - /* 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') - /* There's no need to be ivory-tower about this: check for - one of the most common bugs found in makefiles... */ - fatal (fstart, _("missing separator%s"), - !strneq(line, " ", 8) ? "" - : _(" (did you mean TAB instead of 8 spaces?)")); - continue; - } - - /* Make the colon the end-of-string so we know where to stop - looking for targets. */ - *colonp = '\0'; - filenames = multi_glob (parse_file_seq (&p2, '\0', - sizeof (struct nameseq), - 1), - sizeof (struct nameseq)); - *p2 = ':'; - - 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 = p - variable_buffer; - unsigned int l2 = p2 - variable_buffer; - plen = strlen (p2); - (void) variable_buffer_output (p2+plen, - lb_next, strlen (lb_next)+1); - p = variable_buffer + l; - p2 = variable_buffer + l2; - } - - /* See if it's an "override" or "export" keyword; if so see if what - comes after it looks like a variable definition. */ - - wtype = get_next_mword (p2, NULL, &p, &len); - - v_origin = o_file; - exported = 0; - if (wtype == w_static) - if (word1eq ("override")) - { - v_origin = o_override; - wtype = get_next_mword (p+len, NULL, &p, &len); - } - else if (word1eq ("export")) - { - exported = 1; - wtype = get_next_mword (p+len, NULL, &p, &len); - } - - if (wtype != w_eol) - wtype = get_next_mword (p+len, NULL, NULL, NULL); - - if (wtype == w_varassign) - { - /* If there was a semicolon found, add it back, plus anything - after it. */ - if (semip) - { - unsigned int l = p - variable_buffer; - *(--semip) = ';'; - variable_buffer_output (p2 + strlen (p2), - semip, strlen (semip)+1); - p = variable_buffer + l; - } - record_target_var (filenames, p, two_colon, v_origin, exported, - 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, '=', 0, 0); - - /* 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, ';', 0, 0); - if (cmdleft != 0) - *(cmdleft++) = '\0'; - } - } - - /* Do any of the prerequisites appear to have $@ etc.? */ - have_sysv_atvar = 0; - if (!posix_pedantic) - for (p = strchr (p2, '$'); p != 0; p = strchr (p+1, '$')) - if (p[1] == '@' || ((p[1] == '(' || p[1] == '{') && p[2] == '@')) - { - have_sysv_atvar = 1; - break; - } - - /* Is this a static pattern rule: `target: %targ: %dep; ...'? */ - p = strchr (p2, ':'); - while (p != 0 && p[-1] == '\\') - { - register char *q = &p[-1]; - register 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, ':', sizeof (struct nameseq), 1); - ++p2; - if (target == 0) - fatal (fstart, _("missing target pattern")); - else if (target->next != 0) - fatal (fstart, _("multiple target patterns")); - pattern = target->name; - pattern_percent = find_percent (pattern); - if (pattern_percent == 0) - fatal (fstart, _("target pattern contains no `%%'")); - free((char *)target); - } - else - pattern = 0; - - /* Parse the dependencies. */ - deps = (struct dep *) - multi_glob (parse_file_seq (&p2, '|', sizeof (struct dep), 1), - sizeof (struct dep)); - if (*p2) - { - /* Files that follow '|' are special prerequisites that - need only exist in order to satisfy the dependency. - Their modification times are irrelevant. */ - struct dep **deps_ptr = &deps; - struct dep *d; - for (deps_ptr = &deps; *deps_ptr; deps_ptr = &(*deps_ptr)->next) - ; - ++p2; - *deps_ptr = (struct dep *) - multi_glob (parse_file_seq (&p2, '\0', sizeof (struct dep), 1), - sizeof (struct dep)); - for (d = *deps_ptr; d != 0; d = d->next) - d->ignore_mtime = 1; - } - - commands_idx = 0; - if (cmdleft != 0) - { - /* Semicolon means rest of line is a command. */ - unsigned int len = strlen (cmdleft); - - cmds_started = fstart->lineno; - - /* Add this command line to the buffer. */ - if (len + 2 > commands_len) - { - commands_len = (len + 2) * 2; - commands = (char *) xrealloc (commands, commands_len); - } - bcopy (cmdleft, commands, len); - commands_idx += len; - commands[commands_idx++] = '\n'; - } - - 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. */ - rule_complete: - record_waiting_files (); - } - -#undef word1eq - - if (conditionals->if_cmds) - fatal (fstart, _("missing `endif'")); - - /* At eof, record the last rule. */ - record_waiting_files (); - - if (collapsed) - free ((char *) collapsed); - free ((char *) commands); - - return 1; -} - - -/* 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 void -do_define (char *name, unsigned int namelen, - enum variable_origin origin, struct ebuffer *ebuf) -{ - struct floc defstart; - long nlines = 0; - int nlevels = 1; - unsigned int length = 100; - char *definition = (char *) xmalloc (length); - unsigned int idx = 0; - char *p; - - /* Expand the variable name. */ - char *var = (char *) alloca (namelen + 1); - bcopy (name, var, namelen); - var[namelen] = '\0'; - var = variable_expand (var); - - defstart = ebuf->floc; - - while (1) - { - unsigned int len; - char *line; - - ebuf->floc.lineno += nlines; - nlines = readline (ebuf); - - /* If there is nothing left to eval, we're done. */ - if (nlines < 0) - break; - - 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] != '\t') - { - 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') - error (&ebuf->floc, - _("Extraneous text after `endef' directive")); - - if (--nlevels == 0) - { - /* Define the variable. */ - if (idx == 0) - definition[0] = '\0'; - else - definition[idx - 1] = '\0'; - - /* Always define these variables in the global set. */ - define_variable_global (var, strlen (var), definition, - origin, 1, &defstart); - free (definition); - return; - } - } - } - - /* Otherwise add this line to the variable definition. */ - len = strlen (line); - if (idx + len + 1 > length) - { - length = (idx + len) * 2; - definition = (char *) xrealloc (definition, length + 1); - } - - bcopy (line, &definition[idx], len); - idx += len; - /* Separate lines with a newline. */ - definition[idx++] = '\n'; - } - - /* No `endef'!! */ - fatal (&defstart, _("missing `endef', unterminated `define'")); - - /* NOTREACHED */ - return; -} - -/* 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 -1 if the line is invalid, - 0 if following text should be interpreted, - 1 if following text should be ignored. */ - -static int -conditional_line (char *line, const struct floc *flocp) -{ - int notdef; - char *cmdname; - register unsigned int i; - - if (*line == 'i') - { - /* It's an "if..." command. */ - notdef = line[2] == 'n'; - if (notdef) - { - cmdname = line[3] == 'd' ? "ifndef" : "ifneq"; - line += cmdname[3] == 'd' ? 7 : 6; - } - else - { - cmdname = line[2] == 'd' ? "ifdef" : "ifeq"; - line += cmdname[2] == 'd' ? 6 : 5; - } - } - else - { - /* It's an "else" or "endif" command. */ - notdef = line[1] == 'n'; - cmdname = notdef ? "endif" : "else"; - line += notdef ? 5 : 4; - } - - line = next_token (line); - - if (*cmdname == 'e') - { - if (*line != '\0') - error (flocp, _("Extraneous text after `%s' directive"), cmdname); - /* "Else" or "endif". */ - if (conditionals->if_cmds == 0) - fatal (flocp, _("extraneous `%s'"), cmdname); - /* NOTDEF indicates an `endif' command. */ - if (notdef) - --conditionals->if_cmds; - else if (conditionals->seen_else[conditionals->if_cmds - 1]) - fatal (flocp, _("only one `else' per conditional")); - else - { - /* Toggle the state of ignorance. */ - conditionals->ignoring[conditionals->if_cmds - 1] - = !conditionals->ignoring[conditionals->if_cmds - 1]; - /* Record that we have seen an `else' in this conditional. - A second `else' will be erroneous. */ - conditionals->seen_else[conditionals->if_cmds - 1] = 1; - } - for (i = 0; i < conditionals->if_cmds; ++i) - if (conditionals->ignoring[i]) - return 1; - return 0; - } - - if (conditionals->allocated == 0) - { - conditionals->allocated = 5; - conditionals->ignoring = (char *) xmalloc (conditionals->allocated); - conditionals->seen_else = (char *) xmalloc (conditionals->allocated); - } - - ++conditionals->if_cmds; - if (conditionals->if_cmds > conditionals->allocated) - { - conditionals->allocated += 5; - conditionals->ignoring = (char *) - xrealloc (conditionals->ignoring, conditionals->allocated); - conditionals->seen_else = (char *) - xrealloc (conditionals->seen_else, conditionals->allocated); - } - - /* Record that we have seen an `if...' but no `else' so far. */ - conditionals->seen_else[conditionals->if_cmds - 1] = 0; - - /* Search through the stack to see if we're already ignoring. */ - for (i = 0; i < conditionals->if_cmds - 1; ++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[conditionals->if_cmds - 1] = 1; - return 1; - } - - if (cmdname[notdef ? 3 : 2] == 'd') - { - /* "Ifdef" or "ifndef". */ - char *var; - struct variable *v; - register char *p = end_of_token (line); - i = p - line; - p = next_token (p); - if (*p != '\0') - return -1; - - /* Expand the thing we're looking up, so we can use indirect and - constructed variable names. */ - line[i] = '\0'; - var = allocated_variable_expand (line); - - v = lookup_variable (var, strlen (var)); - conditionals->ignoring[conditionals->if_cmds - 1] - = (v != 0 && *v->value != '\0') == notdef; - - free (var); - } - else - { - /* "Ifeq" or "ifneq". */ - char *s1, *s2; - unsigned int len; - char termin = *line == '(' ? ',' : *line; - - if (termin != ',' && termin != '"' && termin != '\'') - return -1; - - s1 = ++line; - /* Find the end of the first string. */ - if (termin == ',') - { - register 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. */ - len = strlen (s2); - s1 = (char *) alloca (len + 1); - bcopy (s2, s1, len + 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 == ')') - { - register 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') - error (flocp, _("Extraneous text after `%s' directive"), cmdname); - - s2 = variable_expand (s2); - conditionals->ignoring[conditionals->if_cmds - 1] - = streq (s1, s2) == notdef; - } - - /* 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; -} - -/* Remove duplicate dependencies in CHAIN. */ - -static unsigned long -dep_hash_1 (const void *key) -{ - return_STRING_HASH_1 (dep_name ((struct dep const *) key)); -} - -static unsigned long -dep_hash_2 (const void *key) -{ - return_STRING_HASH_2 (dep_name ((struct dep const *) key)); -} - -static int -dep_hash_cmp (const void *x, const void *y) -{ - struct dep *dx = (struct dep *) x; - struct dep *dy = (struct dep *) y; - int cmp = strcmp (dep_name (dx), dep_name (dy)); - - /* If the names are the same but ignore_mtimes are not equal, one of these - is an order-only prerequisite and one isn't. That means that we should - remove the one that isn't and keep the one that is. */ - - if (!cmp && dx->ignore_mtime != dy->ignore_mtime) - dx->ignore_mtime = dy->ignore_mtime = 0; - - return cmp; -} - - -void -uniquize_deps (struct dep *chain) -{ - struct hash_table deps; - register struct dep **depp; - - hash_init (&deps, 500, dep_hash_1, dep_hash_2, dep_hash_cmp); - - /* Make sure that no dependencies are repeated. This does not - really matter for the purpose of updating targets, but it - might make some names be listed twice for $^ and $?. */ - - depp = &chain; - while (*depp) - { - struct dep *dep = *depp; - struct dep **dep_slot = (struct dep **) hash_find_slot (&deps, dep); - if (HASH_VACANT (*dep_slot)) - { - hash_insert_at (&deps, dep, dep_slot); - depp = &dep->next; - } - else - { - /* Don't bother freeing duplicates. - It's dangerous and little benefit accrues. */ - *depp = dep->next; - } - } - - hash_free (&deps, 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, int two_colon, - enum variable_origin origin, int exported, - const struct 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; - register char *name = filenames->name; - char *fname; - char *percent; - struct pattern_var *p; - - nextf = filenames->next; - free ((char *) filenames); - - /* If it's a pattern target, then add it to the pattern-specific - variable list. */ - percent = find_percent (name); - if (percent) - { - /* Get a reference for this pattern-specific variable struct. */ - p = create_pattern_var (name, percent); - p->variable.fileinfo = *flocp; - v = parse_variable_definition (&p->variable, defn); - v->value = xstrdup (v->value); - if (!v) - error (flocp, _("Malformed pattern-specific variable definition")); - fname = p->target; - } - 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 (name); - else if (f->double_colon) - f = f->double_colon; - - initialize_file_variables (f, 1); - fname = f->name; - - current_variable_set_list = f->variables; - v = try_variable_definition (flocp, defn, origin, 1); - if (!v) - error (flocp, _("Malformed target-specific variable definition")); - current_variable_set_list = global; - } - - /* Set up the variable to be *-specific. */ - v->origin = origin; - v->per_target = 1; - if (exported) - v->export = v_export; - - /* If it's not an override, check to see if there was a command-line - setting. If so, reset the value. */ - if (origin != o_override) - { - struct variable *gv; - int len = strlen(v->name); - - gv = lookup_variable (v->name, len); - if (gv && (gv->origin == o_env_override || gv->origin == o_command)) - { - if (v->value != 0) - free (v->value); - v->value = xstrdup (gv->value); - v->origin = gv->origin; - v->recursive = gv->recursive; - v->append = 0; - } - } - - /* Free name if not needed further. */ - if (name != fname && (name < fname || name > fname + strlen (fname))) - free (name); - } -} - -/* 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, char *pattern, char *pattern_percent, - struct dep *deps, unsigned int cmds_started, char *commands, - unsigned int commands_idx, int two_colon, - int have_sysv_atvar, const struct floc *flocp, int set_default) -{ - struct nameseq *nextf; - int implicit = 0; - unsigned int max_targets = 0, target_idx = 0; - char **targets = 0, **target_percents = 0; - struct commands *cmds; - - if (commands_idx > 0) - { - cmds = (struct commands *) xmalloc (sizeof (struct commands)); - cmds->fileinfo.filenm = flocp->filenm; - cmds->fileinfo.lineno = cmds_started; - cmds->commands = savestring (commands, commands_idx); - cmds->command_lines = 0; - } - else - cmds = 0; - - for (; filenames != 0; filenames = nextf) - { - char *name = filenames->name; - struct file *f; - struct dep *d; - struct dep *this; - char *implicit_percent; - - nextf = filenames->next; - free (filenames); - - /* Check for .POSIX. We used to do this in snap_deps() but that's not - good enough: it doesn't happen until after the makefile is read, - which means we cannot use its value during parsing. */ - - if (streq (name, ".POSIX")) - posix_pedantic = 1; - - implicit_percent = find_percent (name); - implicit |= implicit_percent != 0; - - if (implicit && pattern != 0) - fatal (flocp, _("mixed implicit and static pattern rules")); - - if (implicit && implicit_percent == 0) - fatal (flocp, _("mixed implicit and normal rules")); - - if (implicit) - { - if (targets == 0) - { - max_targets = 5; - targets = (char **) xmalloc (5 * sizeof (char *)); - target_percents = (char **) xmalloc (5 * sizeof (char *)); - target_idx = 0; - } - else if (target_idx == max_targets - 1) - { - max_targets += 5; - targets = (char **) xrealloc ((char *) targets, - max_targets * sizeof (char *)); - target_percents - = (char **) xrealloc ((char *) target_percents, - max_targets * sizeof (char *)); - } - targets[target_idx] = name; - target_percents[target_idx] = implicit_percent; - ++target_idx; - continue; - } - - /* If there are multiple filenames, 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 data base. */ - this = nextf != 0 ? copy_dep_chain (deps) : deps; - - if (pattern != 0) - { - /* If this is an extended static rule: - `targets: target%pattern: dep%pattern; cmds', - translate each dependency pattern into a plain filename - using the target pattern and this target's name. */ - if (!pattern_matches (pattern, pattern_percent, name)) - { - /* Give a warning if the rule is meaningless. */ - error (flocp, - _("target `%s' doesn't match the target pattern"), name); - this = 0; - } - else - { - /* We use patsubst_expand to do the work of translating - the target pattern, the target's name and the dependencies' - patterns into plain dependency names. */ - char *buffer = variable_expand (""); - - for (d = this; d != 0; d = d->next) - { - char *o; - char *percent = find_percent (d->name); - if (percent == 0) - continue; - o = patsubst_expand (buffer, name, pattern, d->name, - pattern_percent, percent); - /* If the name expanded to the empty string, that's - illegal. */ - if (o == buffer) - fatal (flocp, - _("target `%s' leaves prerequisite pattern empty"), - name); - free (d->name); - d->name = savestring (buffer, o - buffer); - } - } - } - - /* If at least one of the dependencies uses $$@ etc. deal with that. - It would be very nice and very simple to just expand everything, but - it would break a lot of backward compatibility. Maybe that's OK - since we're just emulating a SysV function, and if we do that then - why not emulate it completely (that's what SysV make does: it - re-expands the entire prerequisite list, all the time, with $@ - etc. in scope). But, it would be a pain indeed to document this - ("iff you use $$@, your prerequisite lists is expanded twice...") - Ouch. Maybe better to make the code more complex. */ - - if (have_sysv_atvar) - { - char *p; - int tlen = strlen (name); - char *fnp = strrchr (name, '/'); - int dlen; - int flen; - - if (fnp) - { - dlen = fnp - name; - ++fnp; - flen = strlen (fnp); - } - else - { - dlen = 0; - fnp = name; - flen = tlen; - } - - - for (d = this; d != 0; d = d->next) - for (p = strchr (d->name, '$'); p != 0; p = strchr (p+1, '$')) - { - char *s = p; - char *at; - int atlen; - - /* If it's '$@', '$(@', or '${@', it's escaped */ - if ((++p)[0] == '$' - && (p[1] == '@' - || ((p[1] == '(' || p[1] == '{') && p[2] == '@'))) - { - bcopy (p, s, strlen (p)+1); - continue; - } - - /* Maybe found one. We like anything of any form matching @, - [({]@[}):], or [({]@[DF][}):]. */ - - if (! (p[0] == '@' - || ((p[0] == '(' || p[0] == '{') && (++p)[0] == '@' - && (((++p)[0] == ')' || p[0] == '}' || p[0] == ':') - || ((p[1] == ')' || p[1] == '}' || p[1] == ':') - && (p[0] == 'D' || p[0] == 'F')))))) - continue; - - /* Found one. Compute the length and string ptr. Move p - past the variable reference. */ - switch (p[0]) - { - case 'D': - atlen = dlen; - at = name; - p += 2; - break; - - case 'F': - atlen = flen; - at = fnp; - p += 2; - break; - - default: - atlen = tlen; - at = name; - ++p; - break; - } - - /* Get more space. */ - { - int soff = s - d->name; - int poff = p - d->name; - d->name = (char *) xrealloc (d->name, - strlen (d->name) + atlen + 1); - s = d->name + soff; - p = d->name + poff; - } - - /* Copy the string over. */ - bcopy(p, s+atlen, strlen (p)+1); - bcopy(at, s, atlen); - p = s + atlen - 1; - } - } - - if (!two_colon) - { - /* Single-colon. Combine these dependencies - with others in file's existing record, if any. */ - f = enter_file (name); - - if (f->double_colon) - 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) - 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) - { - error (&cmds->fileinfo, - _("warning: overriding commands for target `%s'"), - f->name); - error (&f->cmds->fileinfo, - _("warning: ignoring old commands for target `%s'"), - f->name); - } - - f->is_target = 1; - - /* 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) - { - d = f->deps; - while (d != 0) - { - struct dep *nextd = d->next; - free (d->name); - free ((char *)d); - d = nextd; - } - f->deps = 0; - } - else if (f->deps != 0) - { - /* Add the file's old deps and the new ones in THIS together. */ - - struct dep *firstdeps, *moredeps; - if (cmds != 0) - { - /* This is the rule with commands, so put its deps first. - The rationale behind this is that $< expands to the - first dep in the chain, and commands use $< expecting - to get the dep that rule specifies. */ - firstdeps = this; - moredeps = f->deps; - } - else - { - /* Append the new deps to the old ones. */ - firstdeps = f->deps; - moredeps = this; - } - - if (firstdeps == 0) - firstdeps = moredeps; - else - { - d = firstdeps; - while (d->next != 0) - d = d->next; - d->next = moredeps; - } - - f->deps = firstdeps; - } - else - f->deps = this; - - /* If this is a static pattern rule, set the file's stem to - the part of its name that matched the `%' in the pattern, - so you can use $* in the commands. */ - if (pattern != 0) - { - static char *percent = "%"; - char *buffer = variable_expand (""); - char *o = patsubst_expand (buffer, name, pattern, percent, - pattern_percent, percent); - f->stem = savestring (buffer, o - buffer); - } - } - else - { - /* Double-colon. Make a new record - even if the file already has 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) - fatal (flocp, - _("target file `%s' has both : and :: entries"), f->name); - f = enter_file (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->is_target = 1; - f->deps = this; - f->cmds = cmds; - } - - /* Free name if not needed further. */ - if (f != 0 && name != f->name - && (name < f->name || name > f->name + strlen (f->name))) - { - free (name); - name = f->name; - } - - /* See if this is first target seen whose name does - not start with a `.', unless it contains a slash. */ - if (default_goal_file == 0 && set_default - && (*name != '.' || strchr (name, '/') != 0 -#ifdef HAVE_DOS_PATHS - || strchr (name, '\\') != 0 -#endif - )) - { - int reject = 0; - - /* 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) - { - register unsigned int len = strlen (dep_name (d2)); - if (!strneq (name, dep_name (d2), len)) - continue; - if (streq (name + len, dep_name (d))) - { - reject = 1; - break; - } - } - if (reject) - break; - } - - if (!reject) - default_goal_file = f; - } - } - - if (implicit) - { - targets[target_idx] = 0; - target_percents[target_idx] = 0; - create_pattern_rule (targets, target_percents, two_colon, deps, cmds, 1); - free ((char *) target_percents); - } -} - -/* 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. */ - -char * -find_char_unquote (char *string, int stop1, int stop2, int blank) -{ - unsigned int string_len = 0; - register char *p = string; - - while (1) - { - if (stop2 && blank) - while (*p != '\0' && *p != stop1 && *p != stop2 - && ! isblank ((unsigned char) *p)) - ++p; - else if (stop2) - while (*p != '\0' && *p != stop1 && *p != stop2) - ++p; - else if (blank) - while (*p != '\0' && *p != stop1 - && ! isblank ((unsigned char) *p)) - ++p; - else - while (*p != '\0' && *p != stop1) - ++p; - - if (*p == '\0') - break; - - if (p > string && p[-1] == '\\') - { - /* Search for more backslashes. */ - register 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. */ - bcopy (&p[i / 2], &p[i], (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; -} - -/* Search PATTERN for an unquoted %. */ - -char * -find_percent (char *pattern) -{ - return find_char_unquote (pattern, '%', 0, 0); -} - -/* Parse a string into a sequence of filenames represented as a - chain of struct nameseq's in reverse order and return that chain. - - 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. - - If STRIP is nonzero, strip `./'s off the beginning. */ - -struct nameseq * -parse_file_seq (char **stringp, int stopchar, unsigned int size, int strip) -{ - register struct nameseq *new = 0; - register struct nameseq *new1, *lastnew1; - register char *p = *stringp; - char *q; - char *name; - -#ifdef VMS -# define VMS_COMMA ',' -#else -# define VMS_COMMA 0 -#endif - - while (1) - { - /* Skip whitespace; see if any more names are left. */ - p = next_token (p); - if (*p == '\0') - break; - if (*p == stopchar) - break; - - /* Yes, find end of next name. */ - q = p; - p = find_char_unquote (q, stopchar, VMS_COMMA, 1); -#ifdef VMS - /* convert comma separated list to space separated */ - if (p && *p == ',') - *p =' '; -#endif -#ifdef _AMIGA - if (stopchar == ':' && p && *p == ':' - && !(isspace ((unsigned char)p[1]) || !p[1] - || isspace ((unsigned char)p[-1]))) - { - p = find_char_unquote (p+1, stopchar, VMS_COMMA, 1); - } -#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 (stopchar == ':') - while (p != 0 && !isspace ((unsigned char)*p) && - (p[1] == '\\' || p[1] == '/') && isalpha ((unsigned char)p[-1])) - p = find_char_unquote (p + 1, stopchar, VMS_COMMA, 1); -#endif - if (p == 0) - p = q + strlen (q); - - if (strip) -#ifdef VMS - /* Skip leading `[]'s. */ - while (p - q > 2 && q[0] == '[' && q[1] == ']') -#else - /* Skip leading `./'s. */ - while (p - q > 2 && q[0] == '.' && q[1] == '/') -#endif - { - q += 2; /* Skip "./". */ - while (q < p && *q == '/') - /* Skip following slashes: ".//foo" is "foo", not "/foo". */ - ++q; - } - - /* Extract the filename just found, and skip it. */ - - if (q == p) - /* ".///" was stripped to "". */ -#ifdef VMS - continue; -#else -#ifdef _AMIGA - name = savestring ("", 0); -#else - name = savestring ("./", 2); -#endif -#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. - * Savestring called because q may be read-only string constant. - */ - { - char *qbase = xstrdup (q); - char *pbase = qbase + (p-q); - char *q1 = qbase; - char *q2 = q1; - char *p1 = pbase; - - while (q1 != pbase) - { - if (*q1 == '\\' && *(q1+1) == ':') - { - q1++; - p1--; - } - *q2++ = *q1++; - } - name = savestring (qbase, p1 - qbase); - free (qbase); - } -#else - name = savestring (q, p - q); -#endif - - /* Add it to the front of the chain. */ - new1 = (struct nameseq *) xmalloc (size); - new1->name = name; - new1->next = new; - new = new1; - } - -#ifndef NO_ARCHIVES - - /* Look for multi-word archive references. - They are indicated by a elt ending with an unmatched `)' and - an elt further down the chain (i.e., previous in the file list) - with an unmatched `(' (e.g., "lib(mem"). */ - - new1 = new; - lastnew1 = 0; - while (new1 != 0) - if (new1->name[0] != '(' /* Don't catch "(%)" and suchlike. */ - && new1->name[strlen (new1->name) - 1] == ')' - && strchr (new1->name, '(') == 0) - { - /* NEW1 ends with a `)' but does not contain a `('. - Look back for an elt with an opening `(' but no closing `)'. */ - - struct nameseq *n = new1->next, *lastn = new1; - char *paren = 0; - while (n != 0 && (paren = strchr (n->name, '(')) == 0) - { - lastn = n; - n = n->next; - } - if (n != 0 - /* 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). */ - && n->name[0] != '(') - { - /* N is the first element in the archive group. - Its name looks like "lib(mem" (with no closing `)'). */ - - char *libname; - - /* Copy "lib(" into LIBNAME. */ - ++paren; - libname = (char *) alloca (paren - n->name + 1); - bcopy (n->name, libname, paren - n->name); - libname[paren - n->name] = '\0'; - - if (*paren == '\0') - { - /* N was just "lib(", part of something like "lib( a b)". - Edit it out of the chain and free its storage. */ - lastn->next = n->next; - free (n->name); - free ((char *) n); - /* LASTN->next is the new stopping elt for the loop below. */ - n = lastn->next; - } - else - { - /* Replace N's name with the full archive reference. */ - name = concat (libname, paren, ")"); - free (n->name); - n->name = name; - } - - if (new1->name[1] == '\0') - { - /* NEW1 is just ")", part of something like "lib(a b )". - Omit it from the chain and free its storage. */ - if (lastnew1 == 0) - new = new1->next; - else - lastnew1->next = new1->next; - lastn = new1; - new1 = new1->next; - free (lastn->name); - free ((char *) lastn); - } - else - { - /* Replace also NEW1->name, which already has closing `)'. */ - name = concat (libname, new1->name, ""); - free (new1->name); - new1->name = name; - new1 = new1->next; - } - - /* Trace back from NEW1 (the end of the list) until N - (the beginning of the list), rewriting each name - with the full archive reference. */ - - while (new1 != n) - { - name = concat (libname, new1->name, ")"); - free (new1->name); - new1->name = name; - lastnew1 = new1; - new1 = new1->next; - } - } - else - { - /* No frobnication happening. Just step down the list. */ - lastnew1 = new1; - new1 = new1->next; - } - } - else - { - lastnew1 = new1; - new1 = new1->next; - } - -#endif - - *stringp = p; - return new; -} - -/* 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 *p; - - /* 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). */ - - p = ebuf->buffer = ebuf->bufnext; - - while (1) - { - int backslash = 0; - - /* Find the next newline. Keep track of backslashes as we look. */ - for (; *p != '\n' && *p != '\0'; ++p) - if (*p == '\\') - backslash = !backslash; - - /* If we got to the end of the string or a newline with no backslash, - we're done. */ - if (*p == '\0' || !backslash) - break; - } - - /* Overwrite the newline char. */ - *p = '\0'; - ebuf->bufnext = p+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. */ - 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; - p[-1] = '\n'; - } -#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 = (char *) 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; - wtype = w_dcolon; - break; - - case '=': - ++p; - wtype = w_varassign; - break; - } - break; - - 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 (char **arg_dirs) -{ - register unsigned int i; -#ifdef VAXC /* just don't ask ... */ - stat_t stbuf; -#else - struct stat stbuf; -#endif - /* Table to hold the dirs. */ - - register unsigned int defsize = (sizeof (default_include_directories) - / sizeof (default_include_directories[0])); - register unsigned int max = 5; - register char **dirs = (char **) xmalloc ((5 + defsize) * sizeof (char *)); - register unsigned int idx = 0; - -#ifdef __MSDOS__ - defsize++; -#endif - - /* First consider any dirs specified with -I switches. - Ignore dirs that don't exist. */ - - if (arg_dirs != 0) - while (*arg_dirs != 0) - { - char *dir = *arg_dirs++; - int e; - - if (dir[0] == '~') - { - char *expanded = tilde_expand (dir); - if (expanded != 0) - dir = expanded; - } - - EINTRLOOP (e, stat (dir, &stbuf)); - if (e == 0 && S_ISDIR (stbuf.st_mode)) - { - if (idx == max - 1) - { - max += 5; - dirs = (char **) - xrealloc ((char *) dirs, (max + defsize) * sizeof (char *)); - } - dirs[idx++] = dir; - } - else if (dir != arg_dirs[-1]) - free (dir); - } - - /* Now add at the end the standard default dirs. */ - -#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) - { - char *defdir = (char *) xmalloc (strlen (djdir->value) + 8 + 1); - - strcat (strcpy (defdir, djdir->value), "/include"); - dirs[idx++] = defdir; - } - } -#endif - - for (i = 0; default_include_directories[i] != 0; ++i) - { - int e; - - EINTRLOOP (e, stat (default_include_directories[i], &stbuf)); - if (e == 0 && S_ISDIR (stbuf.st_mode)) - dirs[idx++] = default_include_directories[i]; - } - - dirs[idx] = 0; - - /* Now compute the maximum length of any name in it. */ - - max_incl_len = 0; - for (i = 0; i < idx; ++i) - { - unsigned int len = strlen (dirs[i]); - /* If dir name is written with a trailing slash, discard it. */ - if (dirs[i][len - 1] == '/') - /* We can't just clobber a null in because it may have come from - a literal string and literal strings may not be writable. */ - dirs[i] = savestring (dirs[i], len - 1); - if (len > max_incl_len) - max_incl_len = len; - } - - include_directories = dirs; -} - -/* Expand ~ or ~USER at the beginning of NAME. - Return a newly malloc'd string or 0. */ - -char * -tilde_expand (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 = concat (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 concat (pwent->pw_dir, "/", userend + 1); - } - else if (userend != 0) - *userend = '/'; - } -#endif /* !AMIGA && !WINDOWS32 */ -#endif /* !VMS */ - return 0; -} - -/* Given a chain of struct nameseq's describing a sequence of filenames, - in reverse of the intended order, return a new chain describing the - result of globbing the filenames. The new chain is in forward order. - The links of the old chain are freed or used in the new chain. - Likewise for the names in the old chain. - - 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. */ - -struct nameseq * -multi_glob (struct nameseq *chain, unsigned int size) -{ - extern void dir_setup_glob (); - register struct nameseq *new = 0; - register struct nameseq *old; - struct nameseq *nexto; - glob_t gl; - - dir_setup_glob (&gl); - - for (old = chain; old != 0; old = nexto) - { -#ifndef NO_ARCHIVES - char *memname; -#endif - - nexto = old->next; - - if (old->name[0] == '~') - { - char *newname = tilde_expand (old->name); - if (newname != 0) - { - free (old->name); - old->name = newname; - } - } - -#ifndef NO_ARCHIVES - if (ar_name (old->name)) - { - /* OLD->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. */ - char *arname; - ar_parse_name (old->name, &arname, &memname); - free (old->name); - old->name = arname; - } - else - memname = 0; -#endif /* !NO_ARCHIVES */ - - switch (glob (old->name, GLOB_NOCHECK|GLOB_ALTDIRFUNC, NULL, &gl)) - { - case 0: /* Success. */ - { - register int i = gl.gl_pathc; - while (i-- > 0) - { -#ifndef NO_ARCHIVES - if (memname != 0) - { - /* Try to glob on MEMNAME within the archive. */ - struct nameseq *found - = ar_glob (gl.gl_pathv[i], memname, size); - if (found == 0) - { - /* No matches. Use MEMNAME as-is. */ - unsigned int alen = strlen (gl.gl_pathv[i]); - unsigned int mlen = strlen (memname); - struct nameseq *elt - = (struct nameseq *) xmalloc (size); - if (size > sizeof (struct nameseq)) - bzero (((char *) elt) + sizeof (struct nameseq), - size - sizeof (struct nameseq)); - elt->name = (char *) xmalloc (alen + 1 + mlen + 2); - bcopy (gl.gl_pathv[i], elt->name, alen); - elt->name[alen] = '('; - bcopy (memname, &elt->name[alen + 1], mlen); - elt->name[alen + 1 + mlen] = ')'; - elt->name[alen + 1 + mlen + 1] = '\0'; - elt->next = new; - new = elt; - } - else - { - /* Find the end of the FOUND chain. */ - struct nameseq *f = found; - while (f->next != 0) - f = f->next; - - /* Attach the chain being built to the end of the FOUND - chain, and make FOUND the new NEW chain. */ - f->next = new; - new = found; - } - - free (memname); - } - else -#endif /* !NO_ARCHIVES */ - { - struct nameseq *elt = (struct nameseq *) xmalloc (size); - if (size > sizeof (struct nameseq)) - bzero (((char *) elt) + sizeof (struct nameseq), - size - sizeof (struct nameseq)); - elt->name = xstrdup (gl.gl_pathv[i]); - elt->next = new; - new = elt; - } - } - globfree (&gl); - free (old->name); - free ((char *)old); - break; - } - - case GLOB_NOSPACE: - fatal (NILF, _("virtual memory exhausted")); - break; - - default: - old->next = new; - new = old; - break; - } - } - - return new; -} diff --git a/src/gmake/readme.vms b/src/gmake/readme.vms deleted file mode 100644 index d4a9667c..00000000 --- a/src/gmake/readme.vms +++ /dev/null @@ -1,183 +0,0 @@ -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 preceed 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. diff --git a/src/gmake/remake.c b/src/gmake/remake.c deleted file mode 100644 index a13a9a43..00000000 --- a/src/gmake/remake.c +++ /dev/null @@ -1,1416 +0,0 @@ -/* Basic dependency engine for GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, -2002 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.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 PARAMS ((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 seperate `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 int update_file PARAMS ((struct file *file, unsigned int depth)); -static int update_file_1 PARAMS ((struct file *file, unsigned int depth)); -static int check_dep PARAMS ((struct file *file, unsigned int depth, FILE_TIMESTAMP this_mtime, int *must_make_ptr)); -static int touch_file PARAMS ((struct file *file)); -static void remake_file PARAMS ((struct file *file)); -static FILE_TIMESTAMP name_mtime PARAMS ((char *name)); -static int library_search PARAMS ((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 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. */ - -int -update_goal_chain (struct dep *goals, int makefiles) -{ - int t = touch_flag, q = question_flag, n = just_print_flag; - unsigned int j = job_slots; - int status = -1; - -#define MTIME(file) (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; - int x; - check_renamed (file); - if (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; - - x = update_file (file, 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. */ - g->changed += commands_started - ocommands_started; - - /* If we updated a file and STATUS was not already 1, set it to - 1 if updating failed, or to 0 if updating succeeded. Leave - STATUS as it is if no updating was done. */ - - stop = 0; - if ((x != 0 || file->updated) && status < 1) - { - if (file->update_status != 0) - { - /* 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 = (!keep_going_flag && !question_flag - && !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 (!makefiles - || (!just_print_flag && !question_flag)) - status = 0; - if (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; - - 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 (!makefiles - /* If the update_status is zero, 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 == 0 && !g->changed - /* Never give a message under -s or -q. */ - && !silent_flag && !question_flag) - 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 ((char *) 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 (makefiles) - { - touch_flag = t; - question_flag = q; - just_print_flag = n; - job_slots = j; - } - return status; -} - -/* If FILE is not up to date, execute the commands for it. - Return 0 if successful, 1 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 int -update_file (struct file *file, unsigned int depth) -{ - register int status = 0; - register 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) - { - 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) - { - f->considered = considered; - - status |= update_file_1 (f, depth); - check_renamed (f); - - if (status != 0 && !keep_going_flag) - break; - - 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 = 0; - break; - } - } - - /* Process the remaining rules in the double colon chain so they're marked - considered. Start their prerequisites, too. */ - for (; f != 0 ; f = f->prev) - { - struct dep *d; - - f->considered = considered; - - for (d = f->deps; d != 0; d = d->next) - status |= update_file (d->file, depth + 1); - } - - return status; -} - -/* Consider a single `struct file' and update it as appropriate. */ - -static int -update_file_1 (struct file *file, unsigned int depth) -{ - register FILE_TIMESTAMP this_mtime; - int noexist, must_make, deps_changed; - int dep_status = 0; - register struct dep *d, *lastd; - int running = 0; - - DBF (DB_VERBOSE, _("Considering target file `%s'.\n")); - - if (file->updated) - { - if (file->update_status > 0) - { - DBF (DB_VERBOSE, - _("Recently tried and failed to update file `%s'.\n")); - 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 (); - } - - ++depth; - - /* Notice recursive update of the same file. */ - start_updating (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) - 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 commands 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. */ - - lastd = 0; - d = file->deps; - while (d != 0) - { - FILE_TIMESTAMP mtime; - int maybe_make; - - check_renamed (d->file); - - mtime = file_mtime (d->file); - check_renamed (d->file); - - if (is_updating (d->file)) - { - 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; - dep_status |= check_dep (d->file, depth, this_mtime, &maybe_make); - 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 != 0 && !keep_going_flag) - break; - - if (!running) - d->changed = file_mtime (d->file) != 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) - { - FILE_TIMESTAMP mtime = file_mtime (d->file); - check_renamed (d->file); - d->file->parent = file; - dep_status |= update_file (d->file, depth); - 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 != 0 && !keep_going_flag) - break; - - if (!running) - d->changed = ((file->phony && file->cmds != 0) - || file_mtime (d->file) != mtime); - } - } - - finish_updating (file); - - 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 != 0) - { - file->update_status = 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) - 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 commands 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, _("Commands of `%s' are being run.\n")); - return 0; - } - - switch (file->update_status) - { - case 2: - DBF (DB_BASIC, _("Failed to remake target file `%s'.\n")); - break; - case 0: - DBF (DB_BASIC, _("Successfully remade target file `%s'.\n")); - break; - case 1: - DBF (DB_BASIC, _("Target file `%s' needs remade under -q.\n")); - break; - default: - assert (file->update_status >= 0 && file->update_status <= 2); - 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 -1 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: - -1 if this target was not remade; - 0 if 0 or more commands (+ or ${MAKE}) were run and won; - 1 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 == 0) - { - 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 = 0; - /* 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) - { - struct file *f; - 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) - { - 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; - - /* Propagate the change of modification time to all the double-colon - entries for this file. */ - for (f = file->double_colon; f != 0; f = f->prev) - f->last_mtime = file->last_mtime; - } - - if (ran && file->update_status != -1) - /* 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. */ - (void) f_mtime (d->file, 0); - } - else if (file->update_status == -1) - /* Nothing was done for FILE, but it needed nothing done. - So mark it now as "succeeded". */ - file->update_status = 0; -} - -/* 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 int -check_dep (struct file *file, unsigned int depth, - FILE_TIMESTAMP this_mtime, int *must_make_ptr) -{ - struct dep *d; - int dep_status = 0; - - ++depth; - start_updating (file); - - if (!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; - } - - /* If the intermediate file actually exists - and is newer, then we should remake from it. */ - check_renamed (file); - mtime = file_mtime (file); - check_renamed (file); - if (mtime != NONEXISTENT_MTIME && mtime > this_mtime) - *must_make_ptr = 1; - /* 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. */ - else - { - struct dep *lastd; - - lastd = 0; - d = file->deps; - while (d != 0) - { - int maybe_make; - - if (is_updating (d->file)) - { - error (NILF, _("Circular %s <- %s dependency dropped."), - file->name, d->file->name); - if (lastd == 0) - { - file->deps = d->next; - free ((char *) d); - d = file->deps; - } - else - { - lastd->next = d->next; - free ((char *) d); - d = lastd->next; - } - continue; - } - - d->file->parent = file; - maybe_make = *must_make_ptr; - dep_status |= check_dep (d->file, depth, this_mtime, - &maybe_make); - if (! d->ignore_mtime) - *must_make_ptr = maybe_make; - check_renamed (d->file); - if (dep_status != 0 && !keep_going_flag) - break; - - if (d->file->command_state == cs_running - || d->file->command_state == cs_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); - - lastd = d; - d = d->next; - } - } - } - - finish_updating (file); - return dep_status; -} - -/* Touch FILE. Return zero if successful, one if not. */ - -#define TOUCH_ERROR(call) return (perror_with_name (call, file->name), 1) - -static int -touch_file (struct file *file) -{ - if (!silent_flag) - message (0, "touch %s", file->name); - -#ifndef NO_ARCHIVES - if (ar_name (file->name)) - return ar_touch (file->name); - 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; - 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 0; -} - -/* 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 = 0; - else if (file->is_target) - /* This is a nonexistent target file we cannot make. - Pretend it was successfully remade. */ - file->update_status = 0; - else - { - const char *msg_noparent - = _("%sNo rule to make target `%s'%s"); - const char *msg_parent - = _("%sNo rule to make target `%s', needed by `%s'%s"); - - /* This is a dependency file we cannot remake. Fail. */ - if (!keep_going_flag && !file->dontcare) - { - if (file->parent == 0) - fatal (NILF, msg_noparent, "", file->name, ""); - - fatal (NILF, msg_parent, "", file->name, file->parent->name, ""); - } - - if (!file->dontcare) - { - if (file->parent == 0) - error (NILF, msg_noparent, "*** ", file->name, "."); - else - error (NILF, msg_parent, "*** ", - file->name, file->parent->name, "."); - } - file->update_status = 2; - } - } - 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 = 0; - } - - /* 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; - int arname_used = 0; - 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 (arname); - arname_used = 1; - } - 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; - - if (!arname_used) - { - free (arname); - arname_used = 1; - } - - arname = arfile->hname; - arlen = strlen (arname); - memlen = strlen (memname); - - /* free (file->name); */ - - name = (char *) xmalloc (arlen + 1 + memlen + 2); - bcopy (arname, name, arlen); - name[arlen] = '('; - bcopy (memname, name + arlen + 1, 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, name); - else - rehash_file (file, name); - check_renamed (file); - } - - if (!arname_used) - free (arname); - free (memname); - - 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. */ - char *name = file->name; - if (vpath_search (&name, &mtime) - /* Last resort, is it a library (-lxxx)? */ - || (name[0] == '-' && name[1] == 'l' - && library_search (&name, &mtime))) - { - 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); - 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 - && !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 - 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)); - error (NILF, _("Warning: File `%s' has modification time %.2g s in the future"), - file->name, from_now); -#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->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. */ - -static FILE_TIMESTAMP -name_mtime (char *name) -{ - struct stat st; - int e; - - EINTRLOOP (e, stat (name, &st)); - if (e != 0) - { - if (errno != ENOENT && errno != ENOTDIR) - perror_with_name ("stat:", name); - return NONEXISTENT_MTIME; - } - - return FILE_TIMESTAMP_STAT_MODTIME (name, st); -} - - -/* Search for a library file specified as -lLIBNAME, searching for a - suitable library file in the system library directories and the VPATH - directories. */ - -static int -library_search (char **lib, FILE_TIMESTAMP *mtime_ptr) -{ - static 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 - }; - - static char *libpatterns = NULL; - - char *libname = &(*lib)[2]; /* Name without the `-l'. */ - FILE_TIMESTAMP mtime; - - /* Loop variables for the libpatterns value. */ - char *p, *p2; - unsigned int len; - - char *file, **dp; - - /* If we don't have libpatterns, get it. */ - if (!libpatterns) - { - int save = warn_undefined_variables_flag; - warn_undefined_variables_flag = 0; - - libpatterns = xstrdup (variable_expand ("$(strip $(.LIBPATTERNS))")); - - warn_undefined_variables_flag = save; - } - - /* Loop through all the patterns in .LIBPATTERNS, and search on each one. */ - p2 = libpatterns; - while ((p = find_next_token (&p2, &len)) != 0) - { - static char *buf = NULL; - static int buflen = 0; - static int libdir_maxlen = -1; - char *libbuf = variable_expand (""); - - /* Expand the pattern using LIBNAME 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, then remove the - pattern so it's ignored next time. */ - error (NILF, _(".LIBPATTERNS element `%s' is not a pattern"), p); - for (; len; --len, ++p) - *p = ' '; - *p = c; - continue; - } - p4 = variable_buffer_output (libbuf, p, p3-p); - p4 = variable_buffer_output (p4, libname, strlen (libname)); - 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) - { - *lib = xstrdup (libbuf); - if (mtime_ptr != 0) - *mtime_ptr = mtime; - return 1; - } - - /* Now try VPATH search on that. */ - - file = libbuf; - if (vpath_search (&file, mtime_ptr)) - { - *lib = file; - return 1; - } - - /* 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; - } - buflen = strlen (libbuf); - buf = xmalloc(libdir_maxlen + buflen + 2); - } - else if (buflen < strlen (libbuf)) - { - buflen = strlen (libbuf); - buf = xrealloc (buf, libdir_maxlen + buflen + 2); - } - - for (dp = dirs; *dp != 0; ++dp) - { - sprintf (buf, "%s/%s", *dp, libbuf); - mtime = name_mtime (buf); - if (mtime != NONEXISTENT_MTIME) - { - *lib = xstrdup (buf); - if (mtime_ptr != 0) - *mtime_ptr = mtime; - return 1; - } - } - } - - return 0; -} diff --git a/src/gmake/remote-cstms.c b/src/gmake/remote-cstms.c deleted file mode 100644 index dae3535b..00000000 --- a/src/gmake/remote-cstms.c +++ /dev/null @@ -1,302 +0,0 @@ -/* GNU Make remote job exportation interface to the Customs daemon. - THIS CODE IS NOT SUPPORTED BY THE GNU PROJECT. - Please do not send bug reports or questions about it to - the Make maintainers. - -Copyright (C) 1988, 1989, 1992, 1993 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" -#include "job.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 = (char *) 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) - { - 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); - - if (status != RPC_SUCCESS) - { - (void) close (retsock); - (void) close (sock); - error (NILF, "exporting to %s: %s", - host ? host->h_name : inet_ntoa (permit.addr), - Rpc_ErrorMessage (status)); - return 1; - } - else if (msg[0] != 'O' || msg[1] != 'k' || msg[2] != '\0') - { - (void) close (retsock); - (void) close (sock); - error (NILF, "exporting to %s: %s", - host ? host->h_name : inet_ntoa (permit.addr), - msg); - return 1; - } - else - { - error (NILF, "*** exported to %s (id %u)", - host ? host->h_name : inet_ntoa (permit.addr), - permit.id); - } - - fflush (stdout); - fflush (stderr); - - pid = vfork (); - if (pid < 0) - { - /* The fork failed! */ - perror_with_name ("vfork", ""); - 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/src/gmake/remote-stub.c b/src/gmake/remote-stub.c deleted file mode 100644 index 73e6018e..00000000 --- a/src/gmake/remote-stub.c +++ /dev/null @@ -1,101 +0,0 @@ -/* Template for the remote job exportation interface to GNU Make. -Copyright (C) 1988, 1989, 1992, 1993, 1996 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.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) -{ - 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, char **envp, int stdin_fd, - int *is_remote, int *id_ptr, int *used_stdin) -{ - 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, int *signal_ptr, int *coredump_ptr, - int block) -{ - 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, int sig) -{ - return -1; -} diff --git a/src/gmake/rule.c b/src/gmake/rule.c deleted file mode 100644 index 77451cc7..00000000 --- a/src/gmake/rule.c +++ /dev/null @@ -1,603 +0,0 @@ -/* Pattern and suffix rule internals for GNU Make. -Copyright (C) 1988,89,90,91,92,93, 1998 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" -#include "dep.h" -#include "filedef.h" -#include "job.h" -#include "commands.h" -#include "variable.h" -#include "rule.h" - -static void freerule PARAMS ((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; - unsigned int namelen; - register struct rule *rule, *lastrule; - - num_pattern_rules = max_pattern_targets = max_pattern_deps = 0; - max_pattern_dep_length = 0; - - name = 0; - namelen = 0; - rule = pattern_rules; - lastrule = 0; - while (rule != 0) - { - unsigned int ndeps = 0; - register struct dep *dep; - struct rule *next = rule->next; - unsigned int ntargets; - - ++num_pattern_rules; - - ntargets = 0; - while (rule->targets[ntargets] != 0) - ++ntargets; - - if (ntargets > max_pattern_targets) - max_pattern_targets = ntargets; - - for (dep = rule->deps; dep != 0; dep = dep->next) - { - unsigned int len = strlen (dep->name); - -#ifdef VMS - char *p = strrchr (dep->name, ']'); - char *p2; - if (p == 0) - p = strrchr (dep->name, ':'); - p2 = p != 0 ? strchr (dep->name, '%') : 0; -#else - char *p = strrchr (dep->name, '/'); - char *p2 = p != 0 ? strchr (dep->name, '%') : 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 == dep->name) - ++p; - if (p - dep->name > namelen) - { - if (name != 0) - free (name); - namelen = p - dep->name; - name = (char *) xmalloc (namelen + 1); - } - bcopy (dep->name, name, p - dep->name); - name[p - dep->name] = '\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, ""); -#ifdef VMS - if (dep->changed && strchr (name, ':') != 0) -#else - if (dep->changed && *name == '/') -#endif - { - /* The name is absolute and the directory does not exist. - This rule can never possibly match, since this dependency - can never possibly exist. So just remove the rule from - the list. */ - freerule (rule, lastrule); - --num_pattern_rules; - goto end_main_loop; - } - } - else - /* This dependency does not reside in a subdirectory. */ - dep->changed = 0; - } - - if (ndeps > max_pattern_deps) - max_pattern_deps = ndeps; - - lastrule = rule; - end_main_loop: - rule = next; - } - - if (name != 0) - 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 (char *target, char *source, struct commands *cmds) -{ - char *targname, *targpercent, *depname; - char **names, **percents; - struct dep *deps; - unsigned int len; - - 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 - targname = savestring ("(%.obj)", 7); -#else - targname = savestring ("(%.o)", 5); -#endif - targpercent = targname + 1; - } - else - { - /* Construct the target name. */ - len = strlen (target); - targname = xmalloc (1 + len + 1); - targname[0] = '%'; - bcopy (target, targname + 1, len + 1); - targpercent = targname; - } - - names = (char **) xmalloc (2 * sizeof (char *)); - percents = (char **) alloca (2 * sizeof (char *)); - names[0] = targname; - percents[0] = targpercent; - names[1] = percents[1] = 0; - - if (source == 0) - deps = 0; - else - { - /* Construct the dependency name. */ - len = strlen (source); - depname = xmalloc (1 + len + 1); - depname[0] = '%'; - bcopy (source, depname + 1, len + 1); - deps = (struct dep *) xmalloc (sizeof (struct dep)); - deps->next = 0; - deps->name = depname; - deps->ignore_mtime = 0; - } - - create_pattern_rule (names, percents, 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) -{ - register struct dep *d, *d2; - register struct file *f; - register char *rulename; - register unsigned int slen, s2len; - - /* Compute maximum length of all the suffixes. */ - - maxsuffix = 0; - for (d = suffix_file->deps; d != 0; d = d->next) - { - register unsigned int namelen = strlen (dep_name (d)); - if (namelen > maxsuffix) - maxsuffix = namelen; - } - - rulename = (char *) alloca ((maxsuffix * 2) + 1); - - for (d = suffix_file->deps; d != 0; d = d->next) - { - /* 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), (char *) 0, (struct commands *) 0); - - f = d->file; - if (f->cmds != 0) - /* Record a pattern for this suffix's null-suffix rule. */ - convert_suffix_rule ("", dep_name (d), f->cmds); - - /* Record a pattern for each of this suffix's two-suffix rules. */ - slen = strlen (dep_name (d)); - bcopy (dep_name (d), rulename, slen); - for (d2 = suffix_file->deps; d2 != 0; d2 = d2->next) - { - s2len = strlen (dep_name (d2)); - - if (slen == s2len && streq (dep_name (d), dep_name (d2))) - continue; - - bcopy (dep_name (d2), rulename + slen, 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 ((char *) 0, /* 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. */ - -int -new_pattern_rule (struct rule *rule, int override) -{ - register struct rule *r, *lastrule; - register 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; rule->targets[i] != 0; ++i) - { - for (j = 0; r->targets[j] != 0; ++j) - if (!streq (rule->targets[i], r->targets[j])) - break; - if (r->targets[j] == 0) - /* All the targets matched. */ - { - register 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) -{ - register struct rule *r; - char *ptr; - - r = (struct rule *) xmalloc (sizeof (struct rule)); - - r->targets = (char **) xmalloc (2 * sizeof (char *)); - r->suffixes = (char **) xmalloc (2 * sizeof (char *)); - r->lens = (unsigned int *) xmalloc (2 * sizeof (unsigned int)); - - r->targets[1] = 0; - r->suffixes[1] = 0; - r->lens[1] = 0; - - r->lens[0] = strlen (p->target); - /* These will all be string literals, but we malloc space for - them anyway because somebody might want to free them later on. */ - r->targets[0] = savestring (p->target, r->lens[0]); - r->suffixes[0] = find_percent (r->targets[0]); - if (r->suffixes[0] == 0) - /* Programmer-out-to-lunch error. */ - abort (); - else - ++r->suffixes[0]; - - ptr = p->dep; - r->deps = (struct dep *) multi_glob (parse_file_seq (&ptr, '\0', - sizeof (struct dep), 1), - sizeof (struct dep)); - - if (new_pattern_rule (r, 0)) - { - r->terminal = terminal; - r->cmds = (struct commands *) 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; - } -} - - -/* 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; - register unsigned int i; - register struct dep *dep; - - for (i = 0; rule->targets[i] != 0; ++i) - free (rule->targets[i]); - - dep = rule->deps; - while (dep) - { - struct dep *t; - - t = dep->next; - /* We might leak dep->name here, but I'm not sure how to fix this: I - think that pointer might be shared (e.g., in the file hash?) */ - free ((char *) dep); - dep = t; - } - - free ((char *) rule->targets); - free ((char *) rule->suffixes); - free ((char *) 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 ((char *) 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. If TARGET_PERCENTS is not nil, it is an array of - pointers into the elements of TARGETS, where the `%'s are. - 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 is used and must not be freed - until the rule is destroyed. The storage for TARGET_PERCENTS is not used; - it may be freed. */ - -void -create_pattern_rule (char **targets, char **target_percents, - int terminal, struct dep *deps, - struct commands *commands, int override) -{ - register struct rule *r = (struct rule *) xmalloc (sizeof (struct rule)); - register unsigned int max_targets, i; - - r->cmds = commands; - r->deps = deps; - r->targets = targets; - - max_targets = 2; - r->lens = (unsigned int *) xmalloc (2 * sizeof (unsigned int)); - r->suffixes = (char **) xmalloc (2 * sizeof (char *)); - for (i = 0; targets[i] != 0; ++i) - { - if (i == max_targets - 1) - { - max_targets += 5; - r->lens = (unsigned int *) - xrealloc ((char *) r->lens, max_targets * sizeof (unsigned int)); - r->suffixes = (char **) - xrealloc ((char *) r->suffixes, max_targets * sizeof (char *)); - } - r->lens[i] = strlen (targets[i]); - r->suffixes[i] = (target_percents == 0 ? find_percent (targets[i]) - : target_percents[i]) + 1; - if (r->suffixes[i] == 0) - abort (); - } - - if (i < max_targets - 1) - { - r->lens = (unsigned int *) xrealloc ((char *) r->lens, - (i + 1) * sizeof (unsigned int)); - r->suffixes = (char **) xrealloc ((char *) r->suffixes, - (i + 1) * sizeof (char *)); - } - - 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) -{ - register unsigned int i; - register struct dep *d; - - for (i = 0; r->targets[i] != 0; ++i) - { - fputs (r->targets[i], stdout); - if (r->targets[i + 1] != 0) - putchar (' '); - else - putchar (':'); - } - if (r->terminal) - putchar (':'); - - for (d = r->deps; d != 0; d = d->next) - printf (" %s", dep_name (d)); - putchar ('\n'); - - if (r->cmds != 0) - print_commands (r->cmds); -} - -void -print_rule_data_base (void) -{ - register unsigned int rules, terminal; - register 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) - fatal (NILF, _("BUG: num_pattern_rules wrong! %u != %u"), - num_pattern_rules, rules); - } -} diff --git a/src/gmake/rule.h b/src/gmake/rule.h deleted file mode 100644 index 576be9e3..00000000 --- a/src/gmake/rule.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Definitions for using pattern rules in GNU Make. -Copyright (C) 1988, 1989, 1991, 1992, 1993 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -/* Structure used for pattern rules. */ - -struct rule - { - struct rule *next; - char **targets; /* Targets of the rule. */ - unsigned int *lens; /* Lengths of each target. */ - char **suffixes; /* Suffixes (after `%') of each target. */ - struct dep *deps; /* Dependencies of the rule. */ - struct commands *cmds; /* Commands to execute. */ - char terminal; /* If terminal (double-colon). */ - char in_use; /* If in use by a parent pattern_search. */ - }; - -/* For calling install_pattern_rule. */ -struct pspec - { - 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; - - -extern void install_pattern_rule PARAMS ((struct pspec *p, int terminal)); -extern int new_pattern_rule PARAMS ((struct rule *rule, int override)); -extern void count_implicit_rule_limits PARAMS ((void)); -extern void convert_to_pattern PARAMS ((void)); -extern void create_pattern_rule PARAMS ((char **targets, - char **target_percents, int terminal, - struct dep *deps, - struct commands *commands, - int override)); diff --git a/src/gmake/signame.c b/src/gmake/signame.c deleted file mode 100644 index 432c3123..00000000 --- a/src/gmake/signame.c +++ /dev/null @@ -1,251 +0,0 @@ -/* Convert between signal names and numbers. -Copyright (C) 1990,92,93,95,96,99, 2002 Free Software Foundation, Inc. -This file was part of the GNU C Library, but is now part of GNU make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" - -/* If the system provides strsignal, we don't need it. */ - -#if !defined(HAVE_STRSIGNAL) - -/* If the system provides sys_siglist, we'll use that. - Otherwise create our own. - */ - -#if !defined(SYS_SIGLIST_DECLARED) - -/* 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 everytime 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 /* SYS_SIGLIST_DECLARED */ - - -char * -strsignal (int signal) -{ - static char buf[] = "Signal 12345678901234567890"; - -#if !defined(SYS_SIGLIST_DECLARED) - static char sig_initted = 0; - - if (!sig_initted) - sig_initted = signame_init (); -#endif - - if (signal > 0 || signal < NSIG) - return (char *) sys_siglist[signal]; - - sprintf (buf, "Signal %d", signal); - return buf; -} - -#endif /* HAVE_STRSIGNAL */ diff --git a/src/gmake/subproc.bat b/src/gmake/subproc.bat deleted file mode 100644 index 9762cab0..00000000 --- a/src/gmake/subproc.bat +++ /dev/null @@ -1,6 +0,0 @@ -cd w32\subproc -set MAKE=%2 -set MAKEFILE=%1 -if x%2 == x set MAKE=nmake -%MAKE% /f %MAKEFILE% -cd ..\.. diff --git a/src/gmake/tests/.cvsignore b/src/gmake/tests/.cvsignore deleted file mode 100644 index b8f99f5b..00000000 --- a/src/gmake/tests/.cvsignore +++ /dev/null @@ -1 +0,0 @@ -work diff --git a/src/gmake/tests/COPYING b/src/gmake/tests/COPYING deleted file mode 100644 index a43ea212..00000000 --- a/src/gmake/tests/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 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. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) 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 -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 software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. 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. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, 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 redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -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 Program or any portion -of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -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 Program, 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 Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) 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; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, 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 executable. 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. - -If distribution of executable or 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 counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program 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. - - 5. 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 Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program 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. - - 7. 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 Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program 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 Program. - -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. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program 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. - - 9. The Free Software Foundation may publish revised and/or new versions -of the 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 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 Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, 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 - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. - - 12. 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 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. - - END OF TERMS AND CONDITIONS - - Appendix: 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 -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) 19yy - - 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., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision 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, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This 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 Library General -Public License instead of this License. diff --git a/src/gmake/tests/ChangeLog b/src/gmake/tests/ChangeLog deleted file mode 100644 index 0f6da1b8..00000000 --- a/src/gmake/tests/ChangeLog +++ /dev/null @@ -1,407 +0,0 @@ -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. diff --git a/src/gmake/tests/NEWS b/src/gmake/tests/NEWS deleted file mode 100644 index a9fdaee8..00000000 --- a/src/gmake/tests/NEWS +++ /dev/null @@ -1,161 +0,0 @@ -Changes from 0.4.9 to 3.78 (Sep 6, 1999): - - Lots of new tests. Renamed to follow the GNU make scheme. Also - added some support for using Purify with make. - - Rob Tulloh contributed some changes to get the test suite running on - NT; I tweaked them a bit (hopefully I didn't break anything!) Note - that NT doesn't grok the self-exec funkiness that Unix shells use, - so instead I broke that out into a separate shell script - "run_make_tests" that invokes perl with the (renamed) script - run_make_tests.pl. - - Eli Zaretski contributed changes to get the test suite running on - DOS with DJGPP. I also meddled in these somewhat. - - If you're on DOS or NT you should run "perl.exe run_make_tests.pl ..." - If you're on Unix, you can continue to run "./run_make_tests ..." as - before. - -Changes from 0.4.8 to 0.4.9 (May 14, 1998): - - Release by Paul D. Smith ; 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 (ie, 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. diff --git a/src/gmake/tests/README b/src/gmake/tests/README deleted file mode 100644 index 12fa6983..00000000 --- a/src/gmake/tests/README +++ /dev/null @@ -1,79 +0,0 @@ -This is release 3.78 (September 6, 1999) of the GNU make test -suite. See the file NEWS for some of the changes since the last -release. - -This release is made by psmith@gnu.org to correspond to GNU make 3.78. -It won't work correctly for versions before that. In addition to some -infrastructure changes I've added a number of new tests. - -Rob Tulloh has contributed changes to get the suite running on NT. - -Eli Zaretskii and Esa A E Peuha have contributed -changes to get the suite running on DJGPP/DOS. - -This package has a number of problems which preclude me from -distributing it with make as a default "make check" test suite. The -most serious of these is that it's not parallelizable: it scribbles all -over its installation directory and so can only test one make at a -time. I simply don't have time to do more with this than I am so far; -I'm very actively interested in finding someone willing to overhaul the -test suite infrastructure. If you're interested, contact me (see below)! - -The test suite thus far has been written by Steve McGee, Chris Arthur, -and Paul D. Smith. It is covered by the GNU General Public License -(Version 2), described in the file COPYING. - -The test suite requires Perl and is known to work with Perl 4.036 and -Perl 5.004 (available from ftp.gnu.org, and portable to many machines). -Earlier or later versions may work; I don't know. It assumes that the -first "diff" it finds 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 (ie, -"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 test :) - -If you want to run the tests in parallel, you should use the mkshadow -script included here to create temporary "copies" (via symbolic links) -of the test suite, one for each parallel job. This is a pain and one -day maybe the test suite will be rewritten so it's no longer -necessary--volunteers welcome! - -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). - -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 (ie, "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. - -Any complaints/suggestions/bugs/etc. for the test suite itself (as -opposed to problems in make that the suite finds) should be sent to -psmith@gnu.org. Enjoy! - Paul D. Smith - Chris Arthur diff --git a/src/gmake/tests/mkshadow b/src/gmake/tests/mkshadow deleted file mode 100644 index baae8364..00000000 --- a/src/gmake/tests/mkshadow +++ /dev/null @@ -1,42 +0,0 @@ -#!/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 -# - -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/src/gmake/tests/run_make_tests b/src/gmake/tests/run_make_tests deleted file mode 100644 index b68b7849..00000000 --- a/src/gmake/tests/run_make_tests +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec perl $0.pl ${1+"$@"} diff --git a/src/gmake/tests/run_make_tests.pl b/src/gmake/tests/run_make_tests.pl deleted file mode 100644 index 4389d434..00000000 --- a/src/gmake/tests/run_make_tests.pl +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/local/bin/perl -# -*-perl-*- - -# Test driver for the Make test suite - -# Usage: run_make_tests [testname] -# [-debug] -# [-help] -# [-verbose] -# [-keep] -# [-make ] -# (and others) - -$valgrind = 0; # invoke make with valgrind - -require "test_driver.pl"; - -#$SIG{INT} = sub { print STDERR "Caught a signal!\n"; die @_; }; - -sub valid_option -{ - local($option) = @_; - - if ($option =~ /^-make([-_]?path)?$/) - { - $make_path = shift @argv; - if (!-f $make_path) - { - print "$option $make_path: Not found.\n"; - exit 0; - } - return 1; - } - - if ($option =~ /^-valgrind$/i) { - $valgrind = 1; - return 1; - } - -# This doesn't work--it _should_! Someone needs to fix this badly. -# -# elsif ($option =~ /^-work([-_]?dir)?$/) -# { -# $workdir = shift @argv; -# return 1; -# } - - return 0; -} - -sub run_make_with_options -{ - local ($filename,$options,$logname,$expected_code) = @_; - local($code); - local($command) = $make_path; - - $expected_code = 0 unless defined($expected_code); - - if ($filename) - { - $command .= " -f $filename"; - } - - if ($options) - { - $command .= " $options"; - } - - if ($valgrind) { - print VALGRIND "\n\nExecuting: $command\n"; - } - - $code = &run_command_with_output($logname,$command); - - # 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 ($code): $command\n"; - $test_passed = 0; - # If it's a SIGINT, stop here - if ($code & 127) { - print STDERR "\nCaught signal ".($code & 127)."!\n"; - exit($code); - } - return 0; - } - - if ($profile & $vos) - { - system "add_profile $make_path"; - } -1; -} - -sub print_usage -{ - &print_standard_usage ("run_make_tests", "[-make_path make_pathname]"); -} - -sub print_help -{ - &print_standard_help ("-make_path", - "\tYou may specify the pathname of the copy of make to run."); -} - -sub get_this_pwd { - if ($vos) { - $delete_command = "delete_file"; - $__pwd = `++(current_dir)`; - } - else { - $delete_command = "rm"; - 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); - - # Make sure we're in the C locale for those systems that support it, - # so sorting, etc. is predictable. - # - $ENV{LANG} = 'C'; - - # 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) { - $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; - - # Find the full pathname of Make. For DOS systems this is more - # complicated, so we ask make itself. - - $make_path = `sh -c 'echo "all:;\@echo \\\$(MAKE)" | $make_path -f-'`; - chop $make_path; - print "Make\t= `$make_path'\n" if $debug; - - $string = `$make_path -v -f /dev/null 2> /dev/null`; - - $string =~ /^(GNU Make [^,\n]*)/; - $testee_version = "$1\n"; - - $string = `sh -c "$make_path -f /dev/null 2>&1"`; - if ($string =~ /(.*): \*\*\* No targets\. Stop\./) { - $make_name = $1; - } - else { - if ($make_path =~ /$pathsep([^\n$pathsep]*)$/) { - $make_name = $1; - } - else { - $make_name = $make_path; - } - } - - # 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; - } - - # Get Purify log info--if any. - - $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 2>&1"`; - if ($string =~ /not supported/) { - $parallel_jobs = 0; - } - else { - $parallel_jobs = 1; - } - - # Set up for valgrind, if requested. - - if ($valgrind) { -# use POSIX qw(:fcntl_h); -# require Fcntl; - open(VALGRIND, "> valgrind.out") - || die "Cannot open valgrind.out: $!\n"; - # -q --leak-check=yes - $make_path = "valgrind --num-callers=15 --logfile-fd=".fileno(VALGRIND)." $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/src/gmake/tests/scripts/features/comments b/src/gmake/tests/scripts/features/comments deleted file mode 100644 index 9257955f..00000000 --- a/src/gmake/tests/scripts/features/comments +++ /dev/null @@ -1,35 +0,0 @@ -$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/src/gmake/tests/scripts/features/conditionals b/src/gmake/tests/scripts/features/conditionals deleted file mode 100644 index 9aad1d19..00000000 --- a/src/gmake/tests/scripts/features/conditionals +++ /dev/null @@ -1,100 +0,0 @@ -# -*-perl-*- -$description = "Check GNU make conditionals."; - -$details = "Attempt various different flavors of GNU make conditionals."; - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE <<'EOMAKE'; -objects = foo.obj -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 - -EOMAKE - -close(MAKEFILE); - -&run_make_with_options($makefile,"",&get_logfile,0); - -$answer = "arg1 NOT equal arg2 -arg2 equals arg5 -arg3 NOT equal arg4 -variable is undefined -arg4 is defined -"; - -&compare_output($answer,&get_logfile(1)); - - -# Test expansion of variables inside ifdef. - -$makefile2 = &get_tmpfile; - -open(MAKEFILE, "> $makefile2"); - -print MAKEFILE <<'EOF'; - -foo = 1 - -FOO = foo -F = f - -DEF = no -DEF2 = no - -ifdef $(FOO) -DEF = yes -endif - -ifdef $(F)oo -DEF2 = yes -endif - -all:; @echo DEF=$(DEF) DEF2=$(DEF2) - -EOF - -close(MAKEFILE) - -&run_make_with_options($makefile2,"",&get_logfile,0); -$answer = "DEF=yes DEF2=yes\n"; -&compare_output($answer,&get_logfile(1)); - - -# This tells the test driver that the perl test script executed properly. -1; diff --git a/src/gmake/tests/scripts/features/default_names b/src/gmake/tests/scripts/features/default_names deleted file mode 100644 index 501f1fc9..00000000 --- a/src/gmake/tests/scripts/features/default_names +++ /dev/null @@ -1,65 +0,0 @@ -# -*-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); - -# DOS/WIN32 platforms preserve case, but Makefile is the same file as makefile. -# Just test what we can here (avoid Makefile versus makefile test). -# -if ($port_type eq 'UNIX') -{ - # Create another makefile called "makefile" - open(MAKEFILE,"> makefile"); - - print MAKEFILE "SECOND: ; \@echo It chose makefile\n"; - - close(MAKEFILE); -} - - -# Create another makefile called "Makefile" -open(MAKEFILE,"> Makefile"); - -print MAKEFILE "THIRD: ; \@echo It chose Makefile\n"; - -close(MAKEFILE); - - -&run_make_with_options("","",&get_logfile); - -# Create the answer to what should be produced by this Makefile -$answer = "It chose GNUmakefile\n"; - -# COMPARE RESULTS - -&compare_output($answer,&get_logfile(1)) || &error("abort"); -unlink $makefile; - -# DOS/WIN32 platforms preserve case, but Makefile is the same file as makefile. -# Just test what we can here (avoid Makefile versus makefile test). -# -if ($port_type eq 'UNIX') -{ - $answer = "It chose makefile\n"; - - &run_make_with_options("","",&get_logfile); - - &compare_output($answer,&get_logfile(1)) || &error("abort"); - unlink "makefile"; -} - -$answer = "It chose Makefile\n"; - -&run_make_with_options("","",&get_logfile); - -&compare_output($answer,&get_logfile(1)) || &error("abort"); -unlink "Makefile"; diff --git a/src/gmake/tests/scripts/features/double_colon b/src/gmake/tests/scripts/features/double_colon deleted file mode 100644 index 082b815a..00000000 --- a/src/gmake/tests/scripts/features/double_colon +++ /dev/null @@ -1,127 +0,0 @@ -# -*-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'); - -1; diff --git a/src/gmake/tests/scripts/features/echoing b/src/gmake/tests/scripts/features/echoing deleted file mode 100644 index ed1e8622..00000000 --- a/src/gmake/tests/scripts/features/echoing +++ /dev/null @@ -1,90 +0,0 @@ -$description = "The following test creates a makefile to test command \n" - ."echoing. It tests that when a command line starts with \n" - ."a '\@', the echoing of that line is suppressed. It also \n" - ."tests the -n option which tells make to ONLY echo the \n" - ."commands and no execution happens. In this case, even \n" - ."the commands with '\@' are printed. Lastly, it tests the \n" - ."-s flag which tells make to prevent all echoing, as if \n" - ."all commands started with a '\@'."; - -$details = "This test is similar to the 'clean' test except that a '\@' has\n" - ."been placed in front of the delete command line. Four tests \n" - ."are run here. First, make is run normally and the first echo\n" - ."command should be executed. In this case there is no '\@' so \n" - ."we should expect make to display the command AND display the \n" - ."echoed message. Secondly, make is run with the clean target, \n" - ."but since there is a '\@' at the beginning of the command, we\n" - ."expect no output; just the deletion of a file which we check \n" - ."for. Third, we give the clean target again except this time\n" - ."we give make the -n option. We now expect the command to be \n" - ."displayed but not to be executed. In this case we need only \n" - ."to check the output since an error message would be displayed\n" - ."if it actually tried to run the delete command again and the \n" - ."file didn't exist. Lastly, we run the first test again with \n" - ."the -s option and check that make did not echo the echo \n" - ."command before printing the message."; - -$example = "EXAMPLE_FILE"; - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE "all: \n"; -print MAKEFILE "\techo This makefile did not clean the dir... good\n"; -print MAKEFILE "clean: \n"; -print MAKEFILE "\t\@$delete_command $example\n"; - -# END of Contents of MAKEFILE - -close(MAKEFILE); - -&touch($example); - -# TEST #1 -# ------- - -&run_make_with_options($makefile,"",&get_logfile,0); -$answer = "echo This makefile did not clean the dir... good\n" - ."This makefile did not clean the dir... good\n"; -&compare_output($answer,&get_logfile(1)); - - -# TEST #2 -# ------- - -&run_make_with_options($makefile,"clean",&get_logfile,0); -$answer = ""; -&compare_output($answer,&get_logfile(1)); - -if (-f $example) -{ - $test_passed = 0; -} - -# TEST #3 -# ------- - -&run_make_with_options($makefile,"-n clean",&get_logfile,0); -$answer = "$delete_command $example\n"; -&compare_output($answer,&get_logfile(1)); - - -# TEST #4 -# ------- - -&run_make_with_options($makefile,"-s",&get_logfile,0); -$answer = "This makefile did not clean the dir... good\n"; -&compare_output($answer,&get_logfile(1)); - - -1; - - - - - - - - - diff --git a/src/gmake/tests/scripts/features/errors b/src/gmake/tests/scripts/features/errors deleted file mode 100644 index a39064f6..00000000 --- a/src/gmake/tests/scripts/features/errors +++ /dev/null @@ -1,93 +0,0 @@ -$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) -{ - $delete_command = "delete_file"; -} -else -{ - $delete_command = "rm"; -} - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE "clean:\n" - ."\t-$delete_command cleanit\n" - ."\t$delete_command foo\n" - ."clean2: \n" - ."\t$delete_command cleanit\n" - ."\t$delete_command foo\n"; - -# END of Contents of MAKEFILE - -close(MAKEFILE); - -&touch("foo"); - -unlink("cleanit"); -$cleanit_error = `sh -c "$delete_command cleanit 2>&1"`; -$delete_error_code = $? >> 8; - -# TEST #1 -# ------- - -$answer = "$delete_command cleanit\n" - . $cleanit_error - ."$make_name: [clean] Error $delete_error_code (ignored)\n" - ."$delete_command foo\n"; - -&run_make_with_options($makefile,"",&get_logfile); - -# 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)); -} - -# 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; -} - - -&touch("foo"); - -# TEST #2 -# ------- - -$answer = "$delete_command cleanit\n" - . $cleanit_error - ."$make_name: [clean2] Error $delete_error_code (ignored)\n" - ."$delete_command foo\n"; - -&run_make_with_options($makefile,"clean2 -i",&get_logfile); - -if (!$vos) -{ - &compare_output($answer,&get_logfile(1)); -} - -if (-f "foo") -{ - $test_passed = 0; -} - -1; diff --git a/src/gmake/tests/scripts/features/escape b/src/gmake/tests/scripts/features/escape deleted file mode 100644 index 88b372a0..00000000 --- a/src/gmake/tests/scripts/features/escape +++ /dev/null @@ -1,60 +0,0 @@ -# -*-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."; - -open(MAKEFILE,"> $makefile"); - -print MAKEFILE <<'EOF'; -$(path)foo : ; @echo cp $^ $@ - -foo\ bar: ; @echo 'touch "$@"' - -sharp: foo\#bar.ext -foo\#bar.ext: ; @echo foo\#bar.ext = '$@' -EOF - -close(MAKEFILE); - - -# TEST 1 - -&run_make_with_options($makefile, "", &get_logfile); -$answer = "cp foo\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST 2: This one should fail, since the ":" is unquoted. - -&run_make_with_options($makefile, "path=p:", &get_logfile, 512); -$answer = "$makefile:1: *** target pattern contains no `%'. Stop.\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST 3: This one should work, since we escape the ":". - -&run_make_with_options($makefile, "'path=p\\:'", &get_logfile, 0); -$answer = "cp p:foo\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST 4: This one should fail, since the escape char is escaped. - -&run_make_with_options($makefile, "'path=p\\\\:'", &get_logfile, 512); -$answer = "$makefile:1: *** target pattern contains no `%'. Stop.\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST 5: This one should work - -&run_make_with_options($makefile, "'foo bar'", &get_logfile, 0); -$answer = "touch \"foo bar\"\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST 6: Test escaped comments - -&run_make_with_options($makefile, "sharp", &get_logfile, 0); -$answer = "foo#bar.ext = foo#bar.ext\n"; -&compare_output($answer,&get_logfile(1)); - -# This tells the test driver that the perl test script executed properly. -1; diff --git a/src/gmake/tests/scripts/features/export b/src/gmake/tests/scripts/features/export deleted file mode 100644 index 1690ee80..00000000 --- a/src/gmake/tests/scripts/features/export +++ /dev/null @@ -1,250 +0,0 @@ -# -*-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. - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE <<'EOMAKE'; - -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" - -EOMAKE - -close(MAKEFILE); - -# TEST 0: basics - -&run_make_with_options($makefile,"",&get_logfile,0); - -$answer = "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz -FOO= BAR= BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"; - -&compare_output($answer,&get_logfile(1)); - -# TEST 1: make sure vars inherited from the parent are exported - -$ENV{FOO} = 1; - -&run_make_with_options($makefile,"",&get_logfile,0); - -$answer = "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz -FOO=foo BAR= BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"; - -&compare_output($answer,&get_logfile(1)); - -delete $ENV{FOO}; - -# TEST 2: global export. Explicit unexport takes precedence. - -&run_make_with_options($makefile,"EXPORT_ALL=1",&get_logfile,0); - -$answer = "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz -FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"; - -&compare_output($answer,&get_logfile(1)); - -# TEST 3: global unexport. Explicit export takes precedence. - -&run_make_with_options($makefile,"UNEXPORT_ALL=1",&get_logfile,0); - -$answer = "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz -FOO= BAR= BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"; - -&compare_output($answer,&get_logfile(1)); - -# TEST 4: both: in the above makefile the unexport comes last so that rules. - -&run_make_with_options($makefile,"EXPORT_ALL=1 UNEXPORT_ALL=1",&get_logfile,0); - -$answer = "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz -FOO= BAR= BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"; - -&compare_output($answer,&get_logfile(1)); - -# TEST 5: test the pseudo target. - -&run_make_with_options($makefile,"EXPORT_ALL_PSEUDO=1",&get_logfile,0); - -$answer = "FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=botz -FOO=foo BAR=bar BAZ=baz BOZ=boz BITZ=bitz BOTZ=\n"; - -&compare_output($answer,&get_logfile(1)); - - -# TEST 6: Test the expansion of variables inside export - -$makefile2 = &get_tmpfile; - -open(MAKEFILE, "> $makefile2"); - -print MAKEFILE <<'EOF'; - -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 - -EOF - -close(MAKEFILE); - -&run_make_with_options($makefile2,"",&get_logfile,0); -$answer = "foo=f-ok bar=b-ok\nfoo=f-ok bar=b-ok\n"; -&compare_output($answer,&get_logfile(1)); - - -# TEST 7: Test the expansion of variables inside unexport - -$makefile3 = &get_tmpfile; - -open(MAKEFILE, "> $makefile3"); - -print MAKEFILE <<'EOF'; - -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 - -EOF - -close(MAKEFILE); - -&run_make_with_options($makefile3,"",&get_logfile,0); -$answer = "foo=f-ok bar=b-ok\nfoo= bar=\n"; -&compare_output($answer,&get_logfile(1)); - - -# TEST 7: Test exporting multiple variables on the same line - -$makefile4 = &get_tmpfile; - -open(MAKEFILE, "> $makefile4"); - -print MAKEFILE <<'EOF'; - -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 -EOF - -close(MAKEFILE); - -&run_make_with_options($makefile4,"",&get_logfile,0); -$answer = "A=a B=b C=c D=d E=e F=f G=g H=h I=i J=j\n"; -&compare_output($answer,&get_logfile(1)); - - -# TEST 8: Test unexporting multiple variables on the same line - -$makefile5 = &get_tmpfile; - -open(MAKEFILE, "> $makefile5"); - -print MAKEFILE <<'EOF'; - -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 -EOF - -close(MAKEFILE); - -@ENV{qw(A B C D E F G H I J)} = qw(1 2 3 4 5 6 7 8 9 10); - -&run_make_with_options($makefile5,"",&get_logfile,0); -$answer = "A= B= C= D= E= F= G= H= I= J=\n"; -&compare_output($answer,&get_logfile(1)); - -delete @ENV{qw(A B C D E F G H I J)}; - - -# This tells the test driver that the perl test script executed properly. -1; diff --git a/src/gmake/tests/scripts/features/include b/src/gmake/tests/scripts/features/include deleted file mode 100644 index 60f4482d..00000000 --- a/src/gmake/tests/scripts/features/include +++ /dev/null @@ -1,61 +0,0 @@ -# -*-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)); - -# 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). - -# The fix to this caused more problems than the error, so I removed it. -# pds -- 22 Jan 2000 - -#&run_make_with_options($makefile, "error", &get_logfile, 512); -#$answer = "$make_name: *** No rule to make target `makeit.mk', needed by `error'.\n"; -#&compare_output($answer, &get_logfile(1)); - -1; diff --git a/src/gmake/tests/scripts/features/mult_rules b/src/gmake/tests/scripts/features/mult_rules deleted file mode 100644 index 6f120f10..00000000 --- a/src/gmake/tests/scripts/features/mult_rules +++ /dev/null @@ -1,78 +0,0 @@ -$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/src/gmake/tests/scripts/features/order_only b/src/gmake/tests/scripts/features/order_only deleted file mode 100644 index e324d681..00000000 --- a/src/gmake/tests/scripts/features/order_only +++ /dev/null @@ -1,112 +0,0 @@ -# -*-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."; - -open(MAKEFILE,"> $makefile"); - -print MAKEFILE <<'EOF'; -foo: bar | baz - @echo '$$^ = $^' - @echo '$$| = $|' - touch $@ - -.PHONY: baz - -bar baz: - touch $@ -EOF - -close(MAKEFILE); - - -# TEST #1 -- just the syntax - -&run_make_with_options($makefile, "", &get_logfile); -$answer = "touch bar\ntouch baz\n\$^ = bar\n\$| = baz\ntouch foo\n"; -&compare_output($answer,&get_logfile(1)); - - -# TEST #2 -- now we do it again: baz is PHONY but foo should _NOT_ be updated - -&run_make_with_options($makefile, "", &get_logfile); -$answer = "touch baz\n"; -&compare_output($answer,&get_logfile(1)); - -unlink(qw(foo bar baz)); - -# Test prereqs that are both order and non-order - -$makefile2 = &get_tmpfile; - -open(MAKEFILE,"> $makefile2"); - -print MAKEFILE <<'EOF'; -foo: bar | baz - @echo '$$^ = $^' - @echo '$$| = $|' - touch $@ - -foo: baz - -.PHONY: baz - -bar baz: - touch $@ -EOF - -close(MAKEFILE); - -# TEST #3 -- Make sure the order-only prereq was promoted to normal. - -&run_make_with_options($makefile2, "", &get_logfile); -$answer = "touch bar\ntouch baz\n\$^ = bar baz\n\$| = \ntouch foo\n"; -&compare_output($answer,&get_logfile(1)); - - -# TEST #4 -- now we do it again - -&run_make_with_options($makefile2, "", &get_logfile); -$answer = "touch baz\n\$^ = bar baz\n\$| = \ntouch foo\n"; -&compare_output($answer,&get_logfile(1)); - -unlink(qw(foo bar baz)); - -# Test empty normal prereqs - -$makefile3 = &get_tmpfile; - -open(MAKEFILE,"> $makefile3"); - -print MAKEFILE <<'EOF'; -foo:| baz - @echo '$$^ = $^' - @echo '$$| = $|' - touch $@ - -.PHONY: baz - -baz: - touch $@ -EOF - -close(MAKEFILE); - -# TEST #5 -- make sure the parser was correct. - -&run_make_with_options($makefile3, "", &get_logfile); -$answer = "touch baz\n\$^ = \n\$| = baz\ntouch foo\n"; -&compare_output($answer,&get_logfile(1)); - - -# TEST #6 -- now we do it again: this time foo won't be built - -&run_make_with_options($makefile3, "", &get_logfile); -$answer = "touch baz\n"; -&compare_output($answer,&get_logfile(1)); - -unlink(qw(foo baz)); - -1; diff --git a/src/gmake/tests/scripts/features/override b/src/gmake/tests/scripts/features/override deleted file mode 100644 index 23e4f2b4..00000000 --- a/src/gmake/tests/scripts/features/override +++ /dev/null @@ -1,34 +0,0 @@ -$description = "The following test creates a makefile to ..."; - -$details = ""; - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE "override define foo\n" - ."\@echo First comes the definition.\n" - ."\@echo Then comes the override.\n" - ."endef\n" - ."all: \n" - ."\t\$(foo)\n"; - -# END of Contents of MAKEFILE - -close(MAKEFILE); - -&run_make_with_options($makefile,"foo=Hello",&get_logfile); - -# Create the answer to what should be produced by this Makefile -$answer = "First comes the definition.\n" - ."Then comes the override.\n"; - -&compare_output($answer,&get_logfile(1)); - -1; - - - - - - diff --git a/src/gmake/tests/scripts/features/parallelism b/src/gmake/tests/scripts/features/parallelism deleted file mode 100644 index cd753928..00000000 --- a/src/gmake/tests/scripts/features/parallelism +++ /dev/null @@ -1,100 +0,0 @@ -# -*-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) { - $delete_command = "delete_file -no_ask"; - $sleep_command = "sleep -seconds"; -} -else { - $delete_command = "rm -f"; - $sleep_command = "sleep"; -} - -open(MAKEFILE,"> $makefile"); - -print MAKEFILE <<"EOF"; -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 -EOF - -close(MAKEFILE); - -&run_make_with_options($makefile, "-j 4", &get_logfile); -$answer = "ONE\nFOUR\nTHREE\nTWO\n"; -&compare_output($answer, &get_logfile(1)); - - -# Test parallelism with included files. Here we sleep/echo while -# building the included files, to test that they are being built in -# parallel. - -$makefile2 = &get_tmpfile; - -open(MAKEFILE,"> $makefile2"); - -print MAKEFILE <<"EOF"; -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" > \$\@ -EOF - -close(MAKEFILE); - -&run_make_with_options("$makefile2", "-j 4", &get_logfile); -$answer = "ONE.inc\nTHREE.inc\nTWO.inc\nONE\nTHREE\nTWO\nsuccess\n"; -&compare_output($answer, &get_logfile(1)); - -unlink('1.inc', '2.inc'); - - -# Test parallelism with included files--this time recurse first and make -# sure the jobserver works. - -$makefile3 = &get_tmpfile; - -open(MAKEFILE,"> $makefile3"); - -print MAKEFILE <<"EOF"; -recurse: ; \@\$(MAKE) --no-print-directory -f $makefile3 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" > \$\@ -EOF - -close(MAKEFILE); - -&run_make_with_options("$makefile3", "-j 4", &get_logfile); -$answer = "ONE.inc\nTHREE.inc\nTWO.inc\nONE\nTHREE\nTWO\nsuccess\n"; -&compare_output($answer, &get_logfile(1)); - -unlink('1.inc', '2.inc'); - -1; diff --git a/src/gmake/tests/scripts/features/patspecific_vars b/src/gmake/tests/scripts/features/patspecific_vars deleted file mode 100644 index 9ace5c41..00000000 --- a/src/gmake/tests/scripts/features/patspecific_vars +++ /dev/null @@ -1,64 +0,0 @@ -# -*-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)); - -1; diff --git a/src/gmake/tests/scripts/features/quoting b/src/gmake/tests/scripts/features/quoting deleted file mode 100644 index 916681c9..00000000 --- a/src/gmake/tests/scripts/features/quoting +++ /dev/null @@ -1,32 +0,0 @@ -# -*-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/src/gmake/tests/scripts/features/recursion b/src/gmake/tests/scripts/features/recursion deleted file mode 100644 index 444f7ce9..00000000 --- a/src/gmake/tests/scripts/features/recursion +++ /dev/null @@ -1,61 +0,0 @@ -# -*-perl-*- -$description = "The following test creates a makefile to ...\n"; - -$details = "DETAILS"; - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE "all: \n" - ."\t\$(MAKE) -f $makefile foo \n" - ."foo: \n" - ."\t\@echo \$(MAKE) \n" - ."\t\@echo MAKELEVEL = \$(MAKELEVEL)\n" - ."\t\$(MAKE) -f $makefile last \n" - ."last: \n" - ."\t\@echo \$(MAKE) \n" - ."\t\@echo MAKELEVEL = \$(MAKELEVEL) \n" - ."\t\@echo THE END\n"; - -# END of Contents of MAKEFILE - -close(MAKEFILE); - -if ($vos) -{ - $answer = "$make_name: Entering directory \`$pwd\'\n" - ."make 'CFLAGS=-O' -f $makefile foo \n" - ."make CFLAGS=-O\n" - ."MAKELEVEL = 0\n" - ."make 'CFLAGS=-O' -f $makefile last \n" - ."make CFLAGS=-O\n" - ."MAKELEVEL = 0\n" - ."THE END\n" - ."$make_name: Leaving directory `$pwd'\n"; -} -else -{ - $answer = "$make_name: Entering directory `$pwd'\n" - ."$mkpath -f $makefile foo \n" - ."${make_name}[1]: Entering directory `$pwd'\n" - ."$mkpath\n" - ."MAKELEVEL = 1\n" - ."$mkpath -f $makefile last \n" - ."${make_name}[2]: Entering directory `$pwd'\n" - ."$mkpath\n" - ."MAKELEVEL = 2\n" - ."THE END\n" - ."${make_name}[2]: Leaving directory `$pwd'\n" - ."${make_name}[1]: Leaving directory `$pwd'\n" - ."$make_name: Leaving directory `$pwd'\n"; -} - -$mkoptions = "CFLAGS=-O -w"; -$mkoptions .= " -j 2" if ($parallel_jobs); - -&run_make_with_options($makefile,$mkoptions,&get_logfile,0); - -&compare_output($answer,&get_logfile(1)); - -1; diff --git a/src/gmake/tests/scripts/features/reinvoke b/src/gmake/tests/scripts/features/reinvoke deleted file mode 100644 index a5a475cb..00000000 --- a/src/gmake/tests/scripts/features/reinvoke +++ /dev/null @@ -1,86 +0,0 @@ -# -*-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."; - -$makefile2 = &get_tmpfile; -$makefile_orig = &get_tmpfile; - -open(MAKEFILE,"> $makefile"); - -print MAKEFILE <> \$\@ - -include $makefile2 - -EOM - -close(MAKEFILE); - -&utouch(-10, $makefile, $makefile2); -&touch($makefile_orig); - -&run_make_with_options($makefile, "", &get_logfile, 0); - -# Create the answer to what should be produced by this Makefile - -$answer = "rebuilding $makefile2.\nrebuilding $makefile.\nrunning rules.\n"; - -&compare_output($answer,&get_logfile(1)) - && unlink "$makefile_orig"; - -# 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. - -$makefile3 = &get_tmpfile; - -open(MAKEFILE, "> $makefile3"); -print MAKEFILE <<'EOM'; -SHELL = /bin/sh - -all: ; @echo hello - -a : b ; echo >> $@ - -b : c ; [ -f $@ ] || echo >> $@ - -c: ; echo >> $@ - -include $(F) -EOM - -close(MAKEFILE); - -&utouch(-20, 'b','a'); -#&utouch(-10, 'a'); -&touch('c'); - -# First try with the file that's not updated "once removed" from the -# file we're including. - -&run_make_with_options($makefile3, "F=a", &get_logfile, 0); - -$answer = "[ -f b ] || echo >> b\nhello\n"; -&compare_output($answer,&get_logfile(1)); - -# 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_with_options($makefile3, "F=b", &get_logfile, 0); - -$answer = "[ -f b ] || echo >> b\nhello\n"; -&compare_output($answer,&get_logfile(1)); - -unlink('a','b','c'); - -# This tells the test driver that the perl test script executed properly. -1; diff --git a/src/gmake/tests/scripts/features/statipattrules b/src/gmake/tests/scripts/features/statipattrules deleted file mode 100644 index 29a7c08c..00000000 --- a/src/gmake/tests/scripts/features/statipattrules +++ /dev/null @@ -1,72 +0,0 @@ -# -*-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"; - -open(MAKEFILE,"> $makefile"); -print MAKEFILE <<'EOF'; -files = foo.elc bar.o lose.o - -$(filter %.o,$(files)): %.o: %.c ; @echo CC -c $(CFLAGS) $< -o $@ - -$(filter %.elc,$(files)): %.elc: %.el ; @echo emacs $< -EOF -close(MAKEFILE); - - -&touch('bar.c', 'lose.c'); - -# TEST #1 -# ------- - -&run_make_with_options($makefile, '', &get_logfile); -$answer = "CC -c bar.c -o bar.o\n"; -&compare_output($answer, &get_logfile(1)); - - -# TEST #2 -# ------- - -&run_make_with_options($makefile, 'lose.o', &get_logfile); -$answer = "CC -c lose.c -o lose.o\n"; -&compare_output($answer, &get_logfile(1)); - - -# TEST #3 -# ------- -&touch("foo.el"); - -&run_make_with_options($makefile, 'foo.elc', &get_logfile); -$answer = "emacs foo.el\n"; -&compare_output($answer, &get_logfile(1)); - - -unlink('foo.el', 'bar.c', 'lose.c'); - - -# TEST #4 -- PR/1670: don't core dump on invalid static pattern rules -# ------- - -$makefile2 = &get_tmpfile; -open(MAKEFILE, "> $makefile2"); -print MAKEFILE "foo: foo%: % ; \@echo $@\n"; -close(MAKEFILE); - -&run_make_with_options($makefile2, '', &get_logfile, 512); -$answer = "$makefile2:1: *** target `foo' leaves prerequisite pattern empty. Stop.\n"; -&compare_output($answer, &get_logfile(1)); - - -1; - - - - - - diff --git a/src/gmake/tests/scripts/features/targetvars b/src/gmake/tests/scripts/features/targetvars deleted file mode 100644 index 3989340c..00000000 --- a/src/gmake/tests/scripts/features/targetvars +++ /dev/null @@ -1,270 +0,0 @@ -# -*-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."; - -open(MAKEFILE,"> $makefile"); - -print MAKEFILE <<'EOF'; -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't 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\=two -ten: one \= 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) -EOF - -close(MAKEFILE); - -# TEST #1 - -&run_make_with_options($makefile, "one two three", &get_logfile); -$answer = "one bar\nfoo two\nBAR=1000\nfoo bar\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST #2 - -&run_make_with_options($makefile, "one two FOO=1 BAR=2", &get_logfile); -$answer = "one 2\n1 2\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST #3 - -&run_make_with_options($makefile, "four", &get_logfile); -$answer = "x ok ok\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST #4 - -&run_make_with_options($makefile, "seven", &get_logfile); -$answer = "eight: seven eight\nseven: seven seven\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST #5 - -&run_make_with_options($makefile, "nine", &get_logfile); -$answer = "wallace bar wallace bar\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST #5-a - -&run_make_with_options($makefile, "nine-a", &get_logfile); -$answer = "baz\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST #6 - -&run_make_with_options($makefile, "ten", &get_logfile); -$answer = "one=two\none bar\n=\nfoo two\nten\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST #6 - -&run_make_with_options($makefile, "foo.q bar.q", &get_logfile); -$answer = "qvar = rvar\nqvar =\n"; -&compare_output($answer,&get_logfile(1)); - -# TEST #7 - -&run_make_with_options($makefile, "foo.t bar.s", &get_logfile); -$answer = "qvar = qvar\nqvar =\n"; -&compare_output($answer,&get_logfile(1)); - - -# TEST #8 -# For PR/1378: Target-specific vars don't inherit correctly - -$makefile2 = &get_tmpfile; - -open(MAKEFILE,"> $makefile2"); -print MAKEFILE <<'EOF'; -foo: FOO = foo -bar: BAR = bar -foo: bar -bar: baz -baz: ; @echo $(FOO) $(BAR) -EOF -close(MAKEFILE); - -&run_make_with_options("$makefile2", "", &get_logfile); -$answer = "foo bar\n"; -&compare_output($answer, &get_logfile(1)); - -# TEST #9 -# For PR/1380: Using += assignment in target-specific variables sometimes fails -# Also PR/1831 - -$makefile3 = &get_tmpfile; - -open(MAKEFILE,"> $makefile3"); -print MAKEFILE <<'EOF'; -.PHONY: all one -all: FOO += baz -all: one; @echo $(FOO) - -FOO = bar - -one: FOO += biz -one: FOO += boz -one: ; @echo $(FOO) -EOF -close(MAKEFILE); - -&run_make_with_options("$makefile3", "", &get_logfile); -$answer = "bar baz biz boz\nbar baz\n"; -&compare_output($answer, &get_logfile(1)); - -# Test #10 - -&run_make_with_options("$makefile3", "one", &get_logfile); -$answer = "bar biz boz\n"; -&compare_output($answer, &get_logfile(1)); - -# Test #11 -# PR/1709: Test semicolons in target-specific variable values - -$makefile4 = &get_tmpfile; - -open(MAKEFILE, "> $makefile4"); -print MAKEFILE <<'EOF'; -foo : FOO = ; ok -foo : ; @echo '$(FOO)' -EOF -close(MAKEFILE); - -&run_make_with_options("$makefile4", "", &get_logfile); -$answer = "; ok\n"; -&compare_output($answer, &get_logfile(1)); - -# Test #12 -# PR/2020: More hassles with += target-specific vars. I _really_ think -# I nailed it this time :-/. - -$makefile5 = &get_tmpfile; - -open(MAKEFILE, "> $makefile5"); -print MAKEFILE <<'EOF'; -.PHONY: a - -BLAH := foo -COMMAND = echo $(BLAH) - -a: ; @$(COMMAND) - -a: BLAH := bar -a: COMMAND += snafu $(BLAH) -EOF -close(MAKEFILE); - -&run_make_with_options("$makefile5", "", &get_logfile); -$answer = "bar snafu bar\n"; -&compare_output($answer, &get_logfile(1)); - -# Test #13 -# Test double-colon rules with target-specific variable values - -$makefile6 = &get_tmpfile; - -open(MAKEFILE, "> $makefile6"); -print MAKEFILE <<'EOF'; -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 - -EOF -close(MAKEFILE); - -&run_make_with_options("$makefile6", "foo", &get_logfile); -$answer = "ok ok foo nopat\nok ok foo nopat\n"; -&compare_output($answer, &get_logfile(1)); - -# Test #14 -# Test double-colon rules with target-specific variable values and -# inheritance - -&run_make_with_options("$makefile6", "bar", &get_logfile); -$answer = "ok ok bar nopat\nok ok bar nopat\n"; -&compare_output($answer, &get_logfile(1)); - -# Test #15 -# Test double-colon rules with pattern-specific variable values - -&run_make_with_options("$makefile6", "foo PATTERN=yes", &get_logfile); -$answer = "ok ok foo pat\nok ok foo pat\n"; -&compare_output($answer, &get_logfile(1)); - - -# Test #16 -# Test target-specific variables with very long command line -# (> make default buffer length) - -$makefile7 = &get_tmpfile; - -open(MAKEFILE, "> $makefile7"); -print MAKEFILE <<'EOF'; -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) - -EOF -close(MAKEFILE); - -&run_make_with_options("$makefile7", '', &get_logfile); -$answer = "no build information\n"; -&compare_output($answer, &get_logfile(1)); - -1; diff --git a/src/gmake/tests/scripts/features/varnesting b/src/gmake/tests/scripts/features/varnesting deleted file mode 100644 index 15d50711..00000000 --- a/src/gmake/tests/scripts/features/varnesting +++ /dev/null @@ -1,34 +0,0 @@ -$description = "The following test creates a makefile to ..."; - -$details = ""; - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE "x = variable1\n" - ."variable2 := Hello\n" - ."y = \$(subst 1,2,\$(x))\n" - ."z = y\n" - ."a := \$(\$(\$(z)))\n" - ."all: \n" - ."\t\@echo \$(a)\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 = "Hello\n"; - -&compare_output($answer,&get_logfile(1)); - -1; - - - - - - diff --git a/src/gmake/tests/scripts/features/vpath b/src/gmake/tests/scripts/features/vpath deleted file mode 100644 index 101a25da..00000000 --- a/src/gmake/tests/scripts/features/vpath +++ /dev/null @@ -1,62 +0,0 @@ -$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; -} - -1; diff --git a/src/gmake/tests/scripts/features/vpath2 b/src/gmake/tests/scripts/features/vpath2 deleted file mode 100644 index 7e970a71..00000000 --- a/src/gmake/tests/scripts/features/vpath2 +++ /dev/null @@ -1,45 +0,0 @@ -$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/src/gmake/tests/scripts/features/vpathgpath b/src/gmake/tests/scripts/features/vpathgpath deleted file mode 100644 index f7683f52..00000000 --- a/src/gmake/tests/scripts/features/vpathgpath +++ /dev/null @@ -1,66 +0,0 @@ -# -*-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/src/gmake/tests/scripts/features/vpathplus b/src/gmake/tests/scripts/features/vpathplus deleted file mode 100644 index a37fbedd..00000000 --- a/src/gmake/tests/scripts/features/vpathplus +++ /dev/null @@ -1,128 +0,0 @@ -# -*-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 -$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/src/gmake/tests/scripts/functions/addprefix b/src/gmake/tests/scripts/functions/addprefix deleted file mode 100644 index 1845552f..00000000 --- a/src/gmake/tests/scripts/functions/addprefix +++ /dev/null @@ -1,44 +0,0 @@ -$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/src/gmake/tests/scripts/functions/addsuffix b/src/gmake/tests/scripts/functions/addsuffix deleted file mode 100644 index da4fbb71..00000000 --- a/src/gmake/tests/scripts/functions/addsuffix +++ /dev/null @@ -1,36 +0,0 @@ -# -*-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/src/gmake/tests/scripts/functions/call b/src/gmake/tests/scripts/functions/call deleted file mode 100644 index f3c54708..00000000 --- a/src/gmake/tests/scripts/functions/call +++ /dev/null @@ -1,99 +0,0 @@ -# -*-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)); - -1; diff --git a/src/gmake/tests/scripts/functions/dir b/src/gmake/tests/scripts/functions/dir deleted file mode 100644 index f48fb8c0..00000000 --- a/src/gmake/tests/scripts/functions/dir +++ /dev/null @@ -1,44 +0,0 @@ -$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/src/gmake/tests/scripts/functions/error b/src/gmake/tests/scripts/functions/error deleted file mode 100644 index ca9b4e44..00000000 --- a/src/gmake/tests/scripts/functions/error +++ /dev/null @@ -1,63 +0,0 @@ -$description = "\ -The following test creates a makefile to test the error function."; - -$details = ""; - -open(MAKEFILE,"> $makefile"); - -print MAKEFILE <<'EOF'; -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 - -EOF - -close(MAKEFILE); - -# Test #1 - -&run_make_with_options($makefile, "ERROR1=yes", &get_logfile, 512); -$answer = "$makefile:2: *** 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:6: *** 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:10: *** 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:14: *** error is definitely. Stop.\n"; -&compare_output($answer,&get_logfile(1)); - -# This tells the test driver that the perl test script executed properly. -1; - - - - - - diff --git a/src/gmake/tests/scripts/functions/eval b/src/gmake/tests/scripts/functions/eval deleted file mode 100644 index 372aaf8d..00000000 --- a/src/gmake/tests/scripts/functions/eval +++ /dev/null @@ -1,137 +0,0 @@ -# -*-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); - -$ENV{EVAR} = '1'; -&run_make_with_options($makefile4, "", &get_logfile); -$answer = "OK\n"; -&compare_output($answer,&get_logfile(1)); - -delete $ENV{EVAR}; - -1; diff --git a/src/gmake/tests/scripts/functions/filter-out b/src/gmake/tests/scripts/functions/filter-out deleted file mode 100644 index 6c8b27a8..00000000 --- a/src/gmake/tests/scripts/functions/filter-out +++ /dev/null @@ -1,28 +0,0 @@ -# -*-perl-*- - -$description = "Test the filter-out function."; - -$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"; - -open(MAKEFILE,"> $makefile"); - -print MAKEFILE <<'EOF'; -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) -EOF - -close(MAKEFILE); - -&run_make_with_options($makefile, "", &get_logfile, 0); -$answer = "foo.elc foo.elc\n"; -&compare_output($answer,&get_logfile(1)); - -1; diff --git a/src/gmake/tests/scripts/functions/findstring b/src/gmake/tests/scripts/functions/findstring deleted file mode 100644 index 48abede6..00000000 --- a/src/gmake/tests/scripts/functions/findstring +++ /dev/null @@ -1,47 +0,0 @@ -$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/src/gmake/tests/scripts/functions/foreach b/src/gmake/tests/scripts/functions/foreach deleted file mode 100644 index b80751b2..00000000 --- a/src/gmake/tests/scripts/functions/foreach +++ /dev/null @@ -1,53 +0,0 @@ -# -*-perl-*- - -# Updated 6.16.93 variable "MAKE" is default was environment override -# For make 3.63 and above - -$description = "The following test creates a makefile to verify -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"; - - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -# On WIN32 systems, the user's path is found in %Path% ($Path) -# -$pathvar = (($port_type eq 'Windows') ? "Path" : "PATH"); - -print 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/src/gmake/tests/scripts/functions/notdir b/src/gmake/tests/scripts/functions/notdir deleted file mode 100644 index 4ed8f9c7..00000000 --- a/src/gmake/tests/scripts/functions/notdir +++ /dev/null @@ -1,44 +0,0 @@ -$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/src/gmake/tests/scripts/functions/origin b/src/gmake/tests/scripts/functions/origin deleted file mode 100644 index eab2d787..00000000 --- a/src/gmake/tests/scripts/functions/origin +++ /dev/null @@ -1,66 +0,0 @@ -# -*-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"; - -# On WIN32 systems, HOME is meaningless. SystemRoot should be defined -# though. With DJGPP, HOME is not guaranteed to be defined. Use DJDIR -# instead. -# -$homevar = (($port_type eq 'Windows') ? "SystemRoot" - : (($port_type eq 'DOS') ? "DJDIR" - : "HOME")); - -open(MAKEFILE,"> $makefile"); - -print MAKEFILE < $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE "foo := moon_light days \n" - ."foo1:= jazz\n" - ."bar := captured \n" - ."bar2 = boy end, has rise A midnight \n" - ."bar3:= \$(foo)\n" - ."s1 := _by\n" - ."s2 := _and_a\n" - ."t1 := \$(addsuffix \$(s1), \$(bar) )\n" - ."t2 := \$(addsuffix \$(s2), \$(foo1) )\n" - ."t3 := \$(t2) \$(t2) \$(t2) \$(t2) \$(t2) \$(t2) \$(t2) \$(t2) \$(t2) \$(t2) \n" - ."t4 := \$(t3) \$(t3) \$(t3) \$(t3) \$(t3) \$(t3) \$(t3) \$(t3) \$(t3) \$(t3) \n" - ."t5 := \$(t4) \$(t4) \$(t4) \$(t4) \$(t4) \$(t4) \$(t4) \$(t4) \$(t4) \$(t4) \n" - ."t6 := \$(t5) \$(t5) \$(t5) \$(t5) \$(t5) \$(t5) \$(t5) \$(t5) \$(t5) \$(t5) \n" - ."t7 := \$(t6) \$(t6) \$(t6) \n" - ."p1 := \$(addprefix \$(foo1), \$(s2) )\n" - ."blank:= \n" - ."all:\n" - ."\t\@echo \$(sort \$(bar2) \$(foo) \$(addsuffix \$(s1), \$(bar) ) \$(t2) \$(bar2) \$(bar3))\n" - ."\t\@echo \$(sort \$(blank) \$(foo) \$(bar2) \$(t1) \$(p1) )\n" - ."\t\@echo \$(sort \$(foo) \$(bar2) \$(t1) \$(t4) \$(t5) \$(t7) \$(t6) )\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 = "A boy captured_by days end, has jazz_and_a midnight moon_light rise\n" - ."A boy captured_by days end, has jazz_and_a midnight moon_light rise\n" - ."A boy captured_by days end, has jazz_and_a midnight moon_light rise\n"; - -&compare_output($answer,&get_logfile(1)); - -1; - - - - - - diff --git a/src/gmake/tests/scripts/functions/strip b/src/gmake/tests/scripts/functions/strip deleted file mode 100644 index 8222433f..00000000 --- a/src/gmake/tests/scripts/functions/strip +++ /dev/null @@ -1,57 +0,0 @@ -# -*-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/src/gmake/tests/scripts/functions/substitution b/src/gmake/tests/scripts/functions/substitution deleted file mode 100644 index 9280dbba..00000000 --- a/src/gmake/tests/scripts/functions/substitution +++ /dev/null @@ -1,37 +0,0 @@ -$description = "The following test creates a makefile to ..."; - -$details = ""; - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE "foo := a.o b.o c.o\n" - ."bar := \$(foo:.o=.c)\n" - ."bar2:= \$(foo:%.o=%.c)\n" - ."bar3:= \$(patsubst %.c,%.o,x.c.c bar.c)\n" - ."all:\n" - ."\t\@echo \$(bar)\n" - ."\t\@echo \$(bar2)\n" - ."\t\@echo \$(bar3)\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 = "a.c b.c c.c\n" - ."a.c b.c c.c\n" - ."x.c.o bar.o\n"; - -&compare_output($answer,&get_logfile(1)); - -1; - - - - - - diff --git a/src/gmake/tests/scripts/functions/suffix b/src/gmake/tests/scripts/functions/suffix deleted file mode 100644 index 0c4f919e..00000000 --- a/src/gmake/tests/scripts/functions/suffix +++ /dev/null @@ -1,57 +0,0 @@ -$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/src/gmake/tests/scripts/functions/value b/src/gmake/tests/scripts/functions/value deleted file mode 100644 index 8e1a6f04..00000000 --- a/src/gmake/tests/scripts/functions/value +++ /dev/null @@ -1,30 +0,0 @@ -# -*-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/src/gmake/tests/scripts/functions/warning b/src/gmake/tests/scripts/functions/warning deleted file mode 100644 index ac0ad643..00000000 --- a/src/gmake/tests/scripts/functions/warning +++ /dev/null @@ -1,63 +0,0 @@ -$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/src/gmake/tests/scripts/functions/wildcard b/src/gmake/tests/scripts/functions/wildcard deleted file mode 100644 index 0f79acc4..00000000 --- a/src/gmake/tests/scripts/functions/wildcard +++ /dev/null @@ -1,105 +0,0 @@ -# -*-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"; - -if ($vos) -{ - $delete_command = "delete_file -no_ask"; -} -else -{ - $delete_command = "rm"; -} - - -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 - -$makefile2 = &get_tmpfile; - -open(MAKEFILE, "> $makefile2"); -print MAKEFILE <<'EOF'; -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)) - -EOF - -close(MAKEFILE); - -&run_make_with_options($makefile2, 'word-e1', &get_logfile, 512); -$answer = "$makefile2:3: *** non-numeric first argument to `word' function: ''. Stop.\n"; -&compare_output($answer, &get_logfile(1)); - -&run_make_with_options($makefile2, 'word-e2', &get_logfile, 512); -$answer = "$makefile2:4: *** non-numeric first argument to `word' function: 'abc '. Stop.\n"; -&compare_output($answer, &get_logfile(1)); - -&run_make_with_options($makefile2, 'word-e3', &get_logfile, 512); -$answer = "$makefile2:5: *** non-numeric first argument to `word' function: '1a'. Stop.\n"; -&compare_output($answer, &get_logfile(1)); - -&run_make_with_options($makefile2, 'wordlist-e1', &get_logfile, 512); -$answer = "$makefile2:7: *** non-numeric first argument to `wordlist' function: ''. Stop.\n"; -&compare_output($answer, &get_logfile(1)); - -&run_make_with_options($makefile2, 'wordlist-e2', &get_logfile, 512); -$answer = "$makefile2:8: *** non-numeric first argument to `wordlist' function: 'abc '. Stop.\n"; -&compare_output($answer, &get_logfile(1)); - -&run_make_with_options($makefile2, 'wordlist-e3', &get_logfile, 512); -$answer = "$makefile2:9: *** non-numeric second argument to `wordlist' function: ' 12a '. Stop.\n"; -&compare_output($answer, &get_logfile(1)); - -# This tells the test driver that the perl test script executed properly. -1; diff --git a/src/gmake/tests/scripts/misc/general1 b/src/gmake/tests/scripts/misc/general1 deleted file mode 100644 index 352fc6ad..00000000 --- a/src/gmake/tests/scripts/misc/general1 +++ /dev/null @@ -1,51 +0,0 @@ -# -*-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 < $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)); - - -1; diff --git a/src/gmake/tests/scripts/misc/general4 b/src/gmake/tests/scripts/misc/general4 deleted file mode 100644 index dd77f539..00000000 --- a/src/gmake/tests/scripts/misc/general4 +++ /dev/null @@ -1,31 +0,0 @@ -# -*-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."; - -open(MAKEFILE,"> $makefile"); - -# The contents of the Makefile ... - -print MAKEFILE <<'EOF'; -# 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 $< $@ -EOF - -close(MAKEFILE); - -&run_make_with_options($makefile,"",&get_logfile); -$answer = "mkdir -p dir/subdir\ntouch dir/subdir/file.b\ncp dir/subdir/file.b dir/subdir/file.a\n"; -&compare_output($answer,&get_logfile(1)); - -1; diff --git a/src/gmake/tests/scripts/options/dash-B b/src/gmake/tests/scripts/options/dash-B deleted file mode 100644 index 32992b3c..00000000 --- a/src/gmake/tests/scripts/options/dash-B +++ /dev/null @@ -1,43 +0,0 @@ -# -*-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."; - -open(MAKEFILE,"> $makefile"); - -print MAKEFILE <<'EOF'; -.SUFFIXES: - -.PHONY: all -all: foo - -foo: bar.x - @echo cp $< $@ - @echo "" > $@ -EOF - -close(MAKEFILE); - - -&touch('bar.x'); - -&run_make_with_options($makefile, '', &get_logfile); -$answer = "cp bar.x foo\n"; -&compare_output($answer, &get_logfile(1)); - -&run_make_with_options($makefile, '', &get_logfile); -$answer = "$make_name: Nothing to be done for `all'.\n"; -&compare_output($answer, &get_logfile(1)); - -&run_make_with_options($makefile, '-B', &get_logfile); -$answer = "cp bar.x foo\n"; -&compare_output($answer, &get_logfile(1)); - -unlink('bar.x', 'foo') unless $keep; - -1; diff --git a/src/gmake/tests/scripts/options/dash-C b/src/gmake/tests/scripts/options/dash-C deleted file mode 100644 index 3f2b3a13..00000000 --- a/src/gmake/tests/scripts/options/dash-C +++ /dev/null @@ -1,48 +0,0 @@ -$description = "The following test creates a makefile to test the -C dir \n" - ."option in make. This option tells make to change to \n" - ."directory dir before reading the makefile."; - -$details = "This test is similar to the clean test except that this test\n" - ."creates the file to delete in the work directory instead of\n" - ."the current directory. Make is called from another directory\n" - ."using the -C workdir option so that it can both find the \n" - ."makefile and the file to delete in the work directory. "; - -$example = $workdir . $pathsep . "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("${testname}.mk", - "-C $workdir clean", - &get_logfile); - -chdir $workdir; -$wpath = &get_this_pwd; -chdir $pwd; - -# Create the answer to what should be produced by this Makefile -$answer = "$make_name: Entering directory `$wpath'\n" - . "$delete_command EXAMPLE_FILE\n" - . "$make_name: Leaving directory `$wpath'\n"; - -&compare_output($answer,&get_logfile(1)); - -if (-f $example) -{ - $test_passed = 0; -} - -1; diff --git a/src/gmake/tests/scripts/options/dash-I b/src/gmake/tests/scripts/options/dash-I deleted file mode 100644 index 0be0bd7f..00000000 --- a/src/gmake/tests/scripts/options/dash-I +++ /dev/null @@ -1,57 +0,0 @@ -$description ="The following test creates a makefile to test the -I option."; - -$details = "\ -This test tests the -I option by including a filename in -another directory and giving make that directory name -under -I in the command line. Without this option, the make -would fail to find the included file. It also checks to make -sure that the -I option gets passed to recursive makes."; - -$makefile2 = &get_tmpfile; - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -$mf2 = substr ($makefile2, index ($makefile2, $pathsep) + 1); -print MAKEFILE < $makefile2"); - -print MAKEFILE < $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/src/gmake/tests/scripts/options/dash-f b/src/gmake/tests/scripts/options/dash-f deleted file mode 100644 index 3aa47460..00000000 --- a/src/gmake/tests/scripts/options/dash-f +++ /dev/null @@ -1,85 +0,0 @@ -$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/src/gmake/tests/scripts/options/dash-k b/src/gmake/tests/scripts/options/dash-k deleted file mode 100644 index fe5689e3..00000000 --- a/src/gmake/tests/scripts/options/dash-k +++ /dev/null @@ -1,100 +0,0 @@ -# -*-perl-*- - -$description = "Test the make -k (don't stop on error) option.\n"; - -$details = "\ -The makefile created in this test is a simulation of building -a small product. However, the trick to this one is that one -of the dependencies of the main target does not exist. -Without the -k option, make would fail immediately and not -build any part of the target. What we are looking for here, -is that make builds the rest of the dependencies even though -it knows that at the end it will fail to rebuild the main target."; - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE < $makefile2"); -print MAKEFILE <<'EOF'; -.SUFFIXES: - -all: exe1 exe2; @echo making $@ - -exe1 exe2: lib; @echo cp $^ $@ - -lib: foo.o; @echo cp $^ $@ - -foo.o: ; exit 1 -EOF - -close(MAKEFILE); - -&run_make_with_options($makefile2, "-k", &get_logfile, $error_code); - -$answer = "exit 1 -$make_name: *** [foo.o] Error 1 -$make_name: Target `all' not remade because of errors.\n"; - -&compare_output($answer, &get_logfile(1)); - -1; diff --git a/src/gmake/tests/scripts/options/dash-l b/src/gmake/tests/scripts/options/dash-l deleted file mode 100644 index 58216f9f..00000000 --- a/src/gmake/tests/scripts/options/dash-l +++ /dev/null @@ -1,55 +0,0 @@ -# -*-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); - -&run_make_with_options($makefile, $mkoptions, &get_logfile); - -$slurp = &read_file_into_string (&get_logfile(1)); -if ($slurp !~ /cannot enforce load limit/) { - &compare_output("", &get_logfile(1)); -} - -1; diff --git a/src/gmake/tests/scripts/options/dash-n b/src/gmake/tests/scripts/options/dash-n deleted file mode 100644 index de19f42c..00000000 --- a/src/gmake/tests/scripts/options/dash-n +++ /dev/null @@ -1,70 +0,0 @@ -# -*-perl-*- -$description = "Test the -n option.\n"; - -$details = "Try various uses of -n and ensure they all give the correct results.\n"; - -open(MAKEFILE, "> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE <<'EOMAKE'; - -final: intermediate ; echo >> $@ -intermediate: orig ; echo >> $@ - -EOMAKE - -close(MAKEFILE); - -&touch('orig'); - -# TEST 0 - -&run_make_with_options($makefile, "", &get_logfile); -$answer = "echo >> intermediate\necho >> final\n"; -&compare_output($answer, &get_logfile(1)); - -# TEST 1 - -&run_make_with_options($makefile, "-Worig -n", &get_logfile); -$answer = "echo >> intermediate\necho >> final\n"; -&compare_output($answer, &get_logfile(1)); - -unlink('orig', 'intermediate', 'final'); - -# We consider the actual updated timestamp of targets with all -# recursive commands, even with -n. - -$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)); - -unlink('a', 'b', 'c'); - -1; diff --git a/src/gmake/tests/scripts/options/dash-q b/src/gmake/tests/scripts/options/dash-q deleted file mode 100644 index 923e4c4b..00000000 --- a/src/gmake/tests/scripts/options/dash-q +++ /dev/null @@ -1,70 +0,0 @@ -# -*-perl-*- -$description = "Test the -q option.\n"; - -$details = "Try various uses of -q and ensure they all give the correct results.\n"; - -open(MAKEFILE, "> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE <<'EOMAKE'; -one: -two: ; -three: ; : -four: ; $(.XY) -five: ; \ - $(.XY) -six: ; \ - $(.XY) - $(.XY) -seven: ; \ - $(.XY) - : foo - $(.XY) -EOMAKE - -close(MAKEFILE); - -# TEST 0 - -&run_make_with_options($makefile, "-q one", &get_logfile); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -# TEST 1 - -&run_make_with_options($makefile, "-q two", &get_logfile); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -# TEST 2 - -&run_make_with_options($makefile, "-q three", &get_logfile, 256); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -# TEST 3 - -&run_make_with_options($makefile, "-q four", &get_logfile); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -# TEST 4 - -&run_make_with_options($makefile, "-q five", &get_logfile); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -# TEST 5 - -&run_make_with_options($makefile, "-q six", &get_logfile); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -# TEST 6 - -&run_make_with_options($makefile, "-q seven", &get_logfile, 256); -$answer = ""; -&compare_output($answer, &get_logfile(1)); - -1; diff --git a/src/gmake/tests/scripts/options/dash-t b/src/gmake/tests/scripts/options/dash-t deleted file mode 100644 index ec27d7af..00000000 --- a/src/gmake/tests/scripts/options/dash-t +++ /dev/null @@ -1,58 +0,0 @@ -# -*-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/src/gmake/tests/scripts/options/general b/src/gmake/tests/scripts/options/general deleted file mode 100644 index d35bb358..00000000 --- a/src/gmake/tests/scripts/options/general +++ /dev/null @@ -1,35 +0,0 @@ -# -*-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/src/gmake/tests/scripts/targets/DEFAULT b/src/gmake/tests/scripts/targets/DEFAULT deleted file mode 100644 index 0cabde94..00000000 --- a/src/gmake/tests/scripts/targets/DEFAULT +++ /dev/null @@ -1,53 +0,0 @@ -$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/src/gmake/tests/scripts/targets/FORCE b/src/gmake/tests/scripts/targets/FORCE deleted file mode 100644 index 90ee48d6..00000000 --- a/src/gmake/tests/scripts/targets/FORCE +++ /dev/null @@ -1,52 +0,0 @@ -$description = "The following tests rules without Commands or Dependencies."; - -$details = "If the rule ...\n"; - -if ($vos) -{ - $delete_command = "delete_file"; -} -else -{ - $delete_command = "rm"; -} - -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)); - -if (-f $example) -{ - $test_passed = 0; -} - -1; - - - - - - - - - diff --git a/src/gmake/tests/scripts/targets/INTERMEDIATE b/src/gmake/tests/scripts/targets/INTERMEDIATE deleted file mode 100644 index 4fdd7a2a..00000000 --- a/src/gmake/tests/scripts/targets/INTERMEDIATE +++ /dev/null @@ -1,108 +0,0 @@ -# -*-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/src/gmake/tests/scripts/targets/PHONY b/src/gmake/tests/scripts/targets/PHONY deleted file mode 100644 index 14d5ae1c..00000000 --- a/src/gmake/tests/scripts/targets/PHONY +++ /dev/null @@ -1,62 +0,0 @@ -$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."; - -if ($vos) -{ - $delete_command = "delete_file"; -} -else -{ - $delete_command = "rm"; -} - -$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); - -&compare_output($answer,&get_logfile(1)); - -if (-f $example) -{ - $test_passed = 0; -} - -1; - - - - - - - - - diff --git a/src/gmake/tests/scripts/targets/SECONDARY b/src/gmake/tests/scripts/targets/SECONDARY deleted file mode 100644 index a6c5dab6..00000000 --- a/src/gmake/tests/scripts/targets/SECONDARY +++ /dev/null @@ -1,112 +0,0 @@ -#! -*-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'); - -# This tells the test driver that the perl test script executed properly. -1; diff --git a/src/gmake/tests/scripts/targets/SILENT b/src/gmake/tests/scripts/targets/SILENT deleted file mode 100644 index 375cad49..00000000 --- a/src/gmake/tests/scripts/targets/SILENT +++ /dev/null @@ -1,51 +0,0 @@ -$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"; - -if ($vos) -{ - $delete_command = "delete_file"; -} -else -{ - $delete_command = "rm"; -} - -$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); - -&compare_output($answer,&get_logfile(1)); -if (-f $example) -{ - $test_passed = 0; -} - -1; - - - - - - - - - diff --git a/src/gmake/tests/scripts/targets/clean b/src/gmake/tests/scripts/targets/clean deleted file mode 100644 index 69f4fd1b..00000000 --- a/src/gmake/tests/scripts/targets/clean +++ /dev/null @@ -1,51 +0,0 @@ -# -*-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); - -&compare_output($answer,&get_logfile(1)) || &error ("abort"); -if (-f $example) { - $test_passed = 0; -} - -1; - - - - - - - - - diff --git a/src/gmake/tests/scripts/test_template b/src/gmake/tests/scripts/test_template deleted file mode 100644 index 773ced3d..00000000 --- a/src/gmake/tests/scripts/test_template +++ /dev/null @@ -1,70 +0,0 @@ -$description = "The following test creates a makefile to ... - "; - -$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 " \n"; - -# END of Contents of MAKEFILE - -close(MAKEFILE); - - -# Run make. You may specify a makefile, but if you don't want to, just -# insert "" where $make_filename is now. You may also specify specific -# options to run make with, but you also don't have to. (Insert "" where it -# says ), The last field in this subroutine call -# is the code which is returned from make. If you think that make should -# execute with no errors, you may OPTIONALLY put 0; Otherwise put the -# error code that you expect back from make for this test. - -# Every time you run make, you just need to say &get_logfile and that -# subroutine will get a new logfile name for you in incrementing order -# according to how many times you call it within ONE test. It is -# reset to 0 at the beginning of every new test script. - -&run_make_with_options($makefile, - "", - &get_logfile, - 0); - - -# THE REST OF THIS FILE DEPENDS HIGHLY ON WHAT KIND OF TEST YOU ARE -# CREATING, SO IT WILL VARY. BASICALLY, YOU MAY INSERT ANYTHING YOU -# WISH AT THIS POINT TO SEE IF THE TEST WORKED OK. IF THERE ARE -# ADDITIONAL TESTS BESIDES &compare_output, AND IT FAILES, YOU -# MUST *** SET $test_passed = 0 !!! *** - -# Create the answer to what should be produced by this Makefile -$answer = ""; - -# 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)); - -# If you wish to &error ("abort -") if the compare fails, then add a "|| &error ("abort -")" to the -# end of the previous line. - -# This tells the test driver that the perl test script executed properly. -1; - - - - - - diff --git a/src/gmake/tests/scripts/variables/CURDIR b/src/gmake/tests/scripts/variables/CURDIR deleted file mode 100644 index ee7cacb1..00000000 --- a/src/gmake/tests/scripts/variables/CURDIR +++ /dev/null @@ -1,20 +0,0 @@ -# -*-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/src/gmake/tests/scripts/variables/MAKE b/src/gmake/tests/scripts/variables/MAKE deleted file mode 100644 index 7c4cf0a5..00000000 --- a/src/gmake/tests/scripts/variables/MAKE +++ /dev/null @@ -1,33 +0,0 @@ -$description = "The following test creates a makefile to test MAKE \n" - ."(very generic)"; - -$details = "DETAILS"; - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE "TMP := \$(MAKE)\n"; -print MAKEFILE "MAKE := \$(subst X=\$(X),,\$(MAKE))\n\n"; -print MAKEFILE "all:\n"; -print MAKEFILE "\t\@echo \$(TMP)\n"; -print MAKEFILE "\t\$(MAKE) -f $makefile foo\n\n"; -print MAKEFILE "foo:\n"; -print MAKEFILE "\t\@echo \$(MAKE)\n"; - -# END of Contents of MAKEFILE - -close(MAKEFILE); - -# Create the answer to what should be produced by this Makefile -$answer = "$mkpath\n$mkpath -f $makefile foo\n" - . "${make_name}[1]: Entering directory `$pwd'\n" - . "$mkpath\n${make_name}[1]: Leaving directory `$pwd'\n"; - -&run_make_with_options($makefile,"",&get_logfile,0); - -&delete("foo"); -# COMPARE RESULTS -&compare_output($answer,&get_logfile(1)); - -1; diff --git a/src/gmake/tests/scripts/variables/MAKECMDGOALS b/src/gmake/tests/scripts/variables/MAKECMDGOALS deleted file mode 100644 index 879283b0..00000000 --- a/src/gmake/tests/scripts/variables/MAKECMDGOALS +++ /dev/null @@ -1,52 +0,0 @@ -# -*-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/src/gmake/tests/scripts/variables/MAKEFILES b/src/gmake/tests/scripts/variables/MAKEFILES deleted file mode 100644 index 3be284b3..00000000 --- a/src/gmake/tests/scripts/variables/MAKEFILES +++ /dev/null @@ -1,34 +0,0 @@ -# -*-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"); -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/src/gmake/tests/scripts/variables/MAKELEVEL b/src/gmake/tests/scripts/variables/MAKELEVEL deleted file mode 100644 index 79a184e4..00000000 --- a/src/gmake/tests/scripts/variables/MAKELEVEL +++ /dev/null @@ -1,34 +0,0 @@ -# -*-perl-mode-*- - -$description = "The following test creates a makefile to test -makelevels in Make. It prints \$(MAKELEVEL) and then -prints the environment variable MAKELEVEL"; - -open(MAKEFILE,"> $makefile"); - -# The Contents of the MAKEFILE ... - -print 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'; -.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\n\$.x\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\n\$.x\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)); - -1; diff --git a/src/gmake/tests/scripts/variables/flavors b/src/gmake/tests/scripts/variables/flavors deleted file mode 100644 index 7c98afd2..00000000 --- a/src/gmake/tests/scripts/variables/flavors +++ /dev/null @@ -1,85 +0,0 @@ -# -*-perl-*- - -$description = "Test various flavors of make variable setting."; - -$details = ""; - -open(MAKEFILE, "> $makefile"); - -# The Contents of the MAKEFILE ... - -print MAKEFILE <<'EOF'; -foo = $(bar) -bar = ${ugh} -ugh = Hello - -all: multi ; @echo $(foo) - -multi: ; $(multi) - -x := foo -y := $(x) bar -x := later - -nullstring := -space := $(nullstring) $(nullstring) - -next: ; @echo $x$(space)$y - -define multi -@echo hi -echo there -endef - -ifdef BOGUS -define -@echo error -endef -endif - -define outer - define inner - A = B - endef -endef - -$(eval $(outer)) - -outer: ; @echo $(inner) - -EOF - -# END of Contents of MAKEFILE - -close(MAKEFILE); - -# TEST #1 -# ------- - -&run_make_with_options($makefile, "", &get_logfile); -$answer = "hi\necho there\nthere\nHello\n"; -&compare_output($answer, &get_logfile(1)); - -# TEST #2 -# ------- - -&run_make_with_options($makefile, "next", &get_logfile); -$answer = "later foo bar\n"; -&compare_output($answer, &get_logfile(1)); - -# TEST #3 -# ------- - -&run_make_with_options($makefile, "BOGUS=true", &get_logfile, 512); -$answer = "$makefile:23: *** empty variable name. Stop.\n"; -&compare_output($answer, &get_logfile(1)); - -# TEST #4 -# ------- - -&run_make_with_options($makefile, "outer", &get_logfile); -$answer = "A = B\n"; -&compare_output($answer, &get_logfile(1)); - - -1; diff --git a/src/gmake/tests/scripts/variables/special b/src/gmake/tests/scripts/variables/special deleted file mode 100644 index 58c86552..00000000 --- a/src/gmake/tests/scripts/variables/special +++ /dev/null @@ -1,68 +0,0 @@ -# -*-perl-*- - -$description = "Test special GNU make variables."; - -$details = ""; - -$makefile2 = &get_tmpfile; - - -open(MAKEFILE, "> $makefile"); - -print MAKEFILE <<'EOF'; - -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))) - -EOF - -close(MAKEFILE); - -# TEST #1 -# ------- - -&run_make_with_options($makefile, "", &get_logfile); -$answer = "X1 =\nX2 = FOO\nLAST = BAR FOO\n"; -&compare_output($answer, &get_logfile(1)); - - - - -# 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)); - - -1; diff --git a/src/gmake/tests/test_driver.pl b/src/gmake/tests/test_driver.pl deleted file mode 100644 index 0130605a..00000000 --- a/src/gmake/tests/test_driver.pl +++ /dev/null @@ -1,1113 +0,0 @@ -#!/usr/local/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. -# End of modification history - -# 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. - -sub toplevel -{ - # Get a clean environment - - %makeENV = (); - - # Pull in benign variables from the user's environment - # - foreach (# UNIX-specific things - 'TZ', 'LANG', 'TMPDIR', 'HOME', 'USER', 'LOGNAME', '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{$_}; - } - - # Replace the environment with the new one - # - %origENV = %ENV; - - # 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. - - foreach $v (keys %ENV) { - delete $ENV{$v}; - } - - %ENV = %makeENV; - - $| = 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 (-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 =~ /^\.\.?$/ || $dir eq 'CVS' || $dir eq 'RCS' - || ! -d "$scriptpath/$dir"); - push (@rmdirs, $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) - { - next if $test =~ /~$/ || -d $test; - push (@TESTS, "$dir/$test"); - } - } - } - - if (@TESTS == 0) - { - &error ("\nNo tests in $scriptpath, and none were specified.\n"); - } - - print "\n"; - - &run_each_test; - - foreach $dir (@rmdirs) - { - rmdir ("$workpath/$dir"); - } - - $| = 1; - - if ($num_failed) - { - print "\n$num_failed Test"; - print "s" unless $num_failed == 1; - print " Failed (See .$diffext files in $workdir dir for details) :-(\n\n"; - return 0; - } - else - { - print "\n$counter Test"; - print "s" unless $counter == 1; - 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 : ''; - - # 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 unixy with no uname)"; - } - elsif ($@ ne "" || $?) - { - eval "chop (\$osname = `sh -c 'uname -a 2>&1'`)"; - if ($@ ne "" || $?) - { - $osname = "(something unixy)"; - } - } - $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_each_test -{ - $counter = 0; - - foreach $testname (sort @TESTS) - { - $counter++; - $test_passed = 1; # reset by test on failure - $num_of_logfiles = 0; - $num_of_tmpfiles = 0; - $description = ""; - $details = ""; - $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'; - $extext = ''; - } - else { - $logext = 'log'; - $diffext = 'diff'; - $baseext = 'base'; - $extext = '.'; - } - $log_filename = "$testpath.$logext"; - $diff_filename = "$testpath.$diffext"; - $base_filename = "$testpath.$baseext"; - $tmp_filename = "$testpath.$tmpfilesuffix"; - - &setup_for_test; # suite-defined - - $output = "........................................................ "; - - substr($output,0,length($testname)) = "$testname "; - - print $output; - - # Run the actual test! - # - $code = do $perl_testname; - if (!defined($code)) - { - $test_passed = 0; - if (length ($@)) - { - warn "\n*** Test died ($testname): $@\n"; - } - else - { - warn "\n*** Couldn't run $perl_testname\n"; - } - } - elsif ($code == -1) { - $test_passed = 0; - } - elsif ($code != 1 && $code != -1) { - $test_passed = 0; - warn "\n*** Test returned $code\n"; - } - - if ($test_passed) { - $status = "ok"; - for ($i = $num_of_tmpfiles; $i; $i--) - { - &delete ($tmp_filename . &num_suffix ($i) ); - } - - for ($i = $num_of_logfiles ? $num_of_logfiles : 1; $i; $i--) - { - &delete ($log_filename . &num_suffix ($i) ); - &delete ($base_filename . &num_suffix ($i) ); - } - } - elsif ($code > 0) { - $status = "FAILED"; - $num_failed++; - } - elsif ($code < 0) { - $status = "N/A"; - --$counter; - } - - # 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 delete -{ - local(@files) = @_; - - if (!$keep) - { - return (unlink @files); - } - - return 1; -} - -sub print_standard_usage -{ - local($plname,@moreusage) = @_; - local($line); - - print "Usage: perl $plname [testname] [-verbose] [-detail] [-keep]\n"; - print " [-profile] [-usage] [-help] " - . "[-debug]\n"; - foreach $line (@moreusage) - { - print " $line\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); - - if ($debug) - { - print "Comparing Output ........ "; - } - - $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) - { - if ($debug) - { - print "ok\n"; - } - return 1; - } - else - { - if ($debug) - { - print "DIFFERENT OUTPUT\n"; - } - $test_passed = 0; - &create_file (&get_basefile, $answer); - - if ($debug) - { - print "\nCreating Difference File ...\n"; - } - # 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; -} - -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; - } - - open ("SAVEDOS" . $default_output_stack_level . "out", ">&STDOUT") - || &error ("ado: $! duping STDOUT\n", 1); - open ("SAVEDOS" . $default_output_stack_level . "err", ">&STDERR") - || &error ("ado: $! duping STDERR\n", 1); - - open (STDOUT, "> " . $filename) - || &error ("ado: $filename: $!\n", 1); - open (STDERR, ">&STDOUT") - || &error ("ado: $filename: $!\n", 1); - - $default_output_stack_level++; -} - -# 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; - } - - if (--$default_output_stack_level < 0) - { - &error ("default output stack has flown under!\n", 1); - } - - close (STDOUT); - close (STDERR); - - open (STDOUT, ">&SAVEDOS" . $default_output_stack_level . "out") - || &error ("ddo: $! duping STDOUT\n", 1); - open (STDERR, ">&SAVEDOS" . $default_output_stack_level . "err") - || &error ("ddo: $! duping STDERR\n", 1); - - close ("SAVEDOS" . $default_output_stack_level . "out") - || &error ("ddo: $! closing SCSDOSout\n", 1); - close ("SAVEDOS" . $default_output_stack_level . "err") - || &error ("ddo: $! closing SAVEDOSerr\n", 1); -} - -# run one command (passed as a list of arg 0 - n), returning 0 on success -# and nonzero on failure. - -sub run_command -{ - local ($code); - - if ($debug) - { - print "\nrun_command: @_\n"; - $code = system @_; - print "run_command: \"@_\" returned $code.\n"; - return $code; - } - - return system @_; -} - -# 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 -{ - local ($filename) = shift; - local ($code); - - &attach_default_output ($filename); - $code = system @_; - &detach_default_output; - if ($debug) - { - print "run_command_with_output: \"@_\" returned $code.\n"; - } - - 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 - { - unlink $object || return 0; - } - } - 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)); -} - -# 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/src/gmake/variable.c b/src/gmake/variable.c deleted file mode 100644 index d74672b3..00000000 --- a/src/gmake/variable.c +++ /dev/null @@ -1,1421 +0,0 @@ -/* Internals of variables for GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, -2002 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.h" -#include "dep.h" -#include "filedef.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 last struct in the chain, so we can add onto the end. */ - -static struct pattern_var *last_pattern_var; - -/* Create a new pattern-specific variable struct. */ - -struct pattern_var * -create_pattern_var (char *target, char *suffix) -{ - register struct pattern_var *p - = (struct pattern_var *) xmalloc (sizeof (struct pattern_var)); - - if (last_pattern_var != 0) - last_pattern_var->next = p; - else - pattern_vars = p; - last_pattern_var = p; - p->next = 0; - - p->target = target; - p->len = strlen (target); - p->suffix = suffix + 1; - - return p; -} - -/* Look up a target in the pattern-specific variable list. */ - -static struct pattern_var * -lookup_pattern_var (struct pattern_var *start, char *target) -{ - struct pattern_var *p; - unsigned int targlen = strlen(target); - - for (p = start ? start->next : pattern_vars; p != 0; p = p->next) - { - 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 }; -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, - char *value, enum variable_origin origin, - int recursive, struct variable_set *set, - const struct 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) - { - if (v->value != 0) - 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 = (struct variable *) xmalloc (sizeof (struct variable)); - v->name = savestring (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->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; -} - -/* 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 * -handle_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]; - } - - bcopy (v->name, p, 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; - - 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) - return v->special ? handle_special_var (v) : v; - } - -#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) -{ - register struct variable_set_list *l = file->variables; - - if (l == 0) - { - l = (struct variable_set_list *) - xmalloc (sizeof (struct variable_set_list)); - l->set = (struct variable_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; - return; - } - - if (file->parent == 0) - l->next = &global_setlist; - else - { - initialize_file_variables (file->parent, reading); - l->next = file->parent->variables; - } - - /* 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. */ - do_variable_definition (&p->variable.fileinfo, p->variable.name, - p->variable.value, p->variable.origin, - p->variable.flavor, 1); - 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; - l->next = file->pat_variables; - } -} - -/* Pop the top set off the current variable set list, - and free all its storage. */ - -static void -free_variable_name_and_value (const void *item) -{ - struct variable *v = (struct variable *) item; - free (v->name); - free (v->value); -} - -void -pop_variable_scope (void) -{ - struct variable_set_list *setlist = current_variable_set_list; - struct variable_set *set = setlist->set; - - current_variable_set_list = setlist->next; - free ((char *) setlist); - - hash_map (&set->table, free_variable_name_and_value); - hash_free (&set->table, 1); - - free ((char *) set); -} - -struct variable_set_list * -create_new_variable_set (void) -{ - register struct variable_set_list *setlist; - register struct variable_set *set; - - set = (struct variable_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; - - return setlist; -} - -/* Create a new variable set and push it on the current setlist. */ - -struct variable_set_list * -push_new_variable_scope (void) -{ - return (current_variable_set_list = create_new_variable_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) -{ - register struct variable_set_list *list0 = *setlist0; - struct variable_set_list *last0 = 0; - - while (setlist1 != 0 && list0 != 0) - { - struct variable_set_list *next = setlist1; - setlist1 = setlist1->next; - - merge_variable_sets (list0->set, next->set); - - last0 = list0; - list0 = list0->next; - } - - if (setlist1 != 0) - { - 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) -{ -#if defined(WINDOWS32) || defined(__EMX__) - extern char* default_shell; -#else - extern char default_shell[]; -#endif - register struct variable *v; - char buf[200]; - - sprintf (buf, "%u", makelevel); - (void) define_variable (MAKELEVEL_NAME, MAKELEVEL_LENGTH, 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); - (void) define_variable ("MAKE_VERSION", 12, buf, 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); - - /* Make $MAKESHELL override $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 ("SHELL", 5, default_shell, o_default, 0); - v->export = v_export; /* Always export SHELL. */ - - /* 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 ("MAKEFILES", 9, "", 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 ("@D", 2, "$(dir $@)", o_automatic, 1); - define_variable ("%D", 2, "$(dir $%)", o_automatic, 1); - define_variable ("*D", 2, "$(dir $*)", o_automatic, 1); - define_variable ("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: - 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 = MAKELEVEL_NAME; - makelevel_key.length = MAKELEVEL_LENGTH; - hash_delete (&table, &makelevel_key); - - result = result_0 = (char **) 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++ = concat (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++ = concat (v->name, "=", v->value); - } - } - - *result = (char *) xmalloc (100); - (void) sprintf (*result, "%s=%u", MAKELEVEL_NAME, makelevel + 1); - *++result = 0; - - hash_free (&table, 0); - - return result_0; -} - -/* 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 struct floc *flocp, const char *varname, - char *value, enum variable_origin origin, - enum variable_flavor flavor, int target_var) -{ - char *p, *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_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; - - 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); - } - 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; - char *val; - - 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 = alloc_value = allocated_variable_expand (val); - - oldlen = strlen (v->value); - vallen = strlen (val); - p = (char *) alloca (oldlen + 1 + vallen + 1); - bcopy (v->value, p, oldlen); - p[oldlen] = ' '; - bcopy (val, &p[oldlen + 1], vallen + 1); - } - } - } - -#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) - { - char shellpath[PATH_MAX]; - 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, (char **)0, shellpath)) - { - char *p; - - for (p = shellpath; *p; p++) - { - if (*p == '\\') - *p = '/'; - } - v = define_variable_loc (varname, strlen (varname), - shellpath, origin, flavor == f_recursive, - flocp); - } - else - { - 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 = (char *)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] = (char *)0; - if (__dosexec_find_on_path (shellbase, fake_env, shellpath)) - { - char *p; - - for (p = shellpath; *p; p++) - { - if (*p == '\\') - *p = '/'; - } - 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) && streq (varname, "SHELL")) - { - extern 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 - v = lookup_variable (varname, strlen (varname)); - } - 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; - - if (alloc_value) - free (alloc_value); - - 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 parse_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 * -parse_variable_definition (struct variable *v, char *line) -{ - register int c; - register char *p = line; - register char *beg; - register char *end; - enum variable_flavor flavor = f_bogus; - char *name; - - while (1) - { - c = *p++; - if (c == '\0' || c == '#') - return 0; - if (c == '=') - { - end = p - 1; - flavor = f_recursive; - break; - } - else if (c == ':') - if (*p == '=') - { - end = p++ - 1; - flavor = f_simple; - break; - } - else - /* A colon other than := is a rule line, not a variable defn. */ - return 0; - else if (c == '+' && *p == '=') - { - end = p++ - 1; - flavor = f_append; - break; - } - else if (c == '?' && *p == '=') - { - end = p++ - 1; - flavor = f_conditional; - break; - } - else if (c == '$') - { - /* This might begin a variable expansion reference. Make sure we - don't misrecognize chars inside the reference as =, := or +=. */ - char closeparen; - int count; - c = *p++; - if (c == '(') - closeparen = ')'; - else if (c == '{') - closeparen = '}'; - else - continue; /* Nope. */ - - /* 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; - } - } - } - } - v->flavor = flavor; - - beg = next_token (line); - while (end > beg && isblank ((unsigned char)end[-1])) - --end; - p = next_token (p); - v->value = p; - - /* Expand the name, so "$(foo)bar = baz" works. */ - name = (char *) alloca (end - beg + 1); - bcopy (beg, name, end - beg); - name[end - beg] = '\0'; - v->name = allocated_variable_expand (name); - - if (v->name[0] == '\0') - 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 parse_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 struct floc *flocp, 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 (!parse_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 = (struct variable *) item; - const char *prefix = (char *) arg; - const char *origin; - - switch (v->origin) - { - 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_automatic: - origin = _("automatic"); - break; - case o_invalid: - default: - abort (); - } - fputs ("# ", stdout); - fputs (origin, 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 - { - register 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'); - } -} - - -/* Print all the variables in SET. PREFIX is printed before - the actual variable definitions (everything else is comments). */ - -void -print_variable_set (struct variable_set *set, char *prefix) -{ - hash_map_arg (&set->table, print_variable, 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, ""); - - 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, "# "); - } - - 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 (struct file *file) -{ - if (file->variables != 0) - print_variable_set (file->variables->set, "# "); -} - -#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, don't leak memory unnecessarily. - * Free the previous entry before allocating new one. - */ - if (environ_path) - free (environ_path); - - /* - * Create something WINDOWS32 world can grok - */ - convert_Path_to_windows32 (path, ';'); - environ_path = concat ("Path", "=", path); - putenv (environ_path); - free (path); -} -#endif diff --git a/src/gmake/variable.h b/src/gmake/variable.h deleted file mode 100644 index 613278a3..00000000 --- a/src/gmake/variable.h +++ /dev/null @@ -1,199 +0,0 @@ -/* Definitions for using variables in GNU Make. -Copyright (C) 1988, 1989, 1990, 1991, 1992, 2002 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#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 (:=) */ - f_recursive, /* Recursive definition (=) */ - f_append, /* Appending definition (+=) */ - f_conditional /* Conditional definition (?=) */ - }; - -/* 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. */ - }; - -/* Structure used for pattern-specific variables. */ - -struct pattern_var - { - struct pattern_var *next; - char *target; - unsigned int len; - char *suffix; - struct variable variable; - }; - -extern char *variable_buffer; -extern struct variable_set_list *current_variable_set_list; - -/* expand.c */ -extern char *variable_buffer_output PARAMS ((char *ptr, char *string, unsigned int length)); -extern char *variable_expand PARAMS ((char *line)); -extern char *allocated_variable_expand_for_file PARAMS ((char *line, struct file *file)); -#define allocated_variable_expand(line) \ - allocated_variable_expand_for_file (line, (struct file *) 0) -extern char *expand_argument PARAMS ((const char *str, const char *end)); -extern char *variable_expand_string PARAMS ((char *line, char *string, - long length)); -extern void install_variable_buffer PARAMS ((char **bufp, unsigned int *lenp)); -extern void restore_variable_buffer PARAMS ((char *buf, unsigned int len)); - -/* function.c */ -extern int handle_function PARAMS ((char **op, char **stringp)); -extern int pattern_matches PARAMS ((char *pattern, char *percent, char *str)); -extern char *subst_expand PARAMS ((char *o, char *text, char *subst, char *replace, - unsigned int slen, unsigned int rlen, int by_word, int suffix_only)); -extern char *patsubst_expand PARAMS ((char *o, char *text, char *pattern, char *replace, - char *pattern_percent, char *replace_percent)); - -/* expand.c */ -extern char *recursively_expand_for_file PARAMS ((struct variable *v, - struct file *file)); -#define recursively_expand(v) recursively_expand_for_file (v, NULL) - -/* variable.c */ -extern struct variable_set_list *create_new_variable_set PARAMS ((void)); -extern struct variable_set_list *push_new_variable_scope PARAMS ((void)); -extern void pop_variable_scope PARAMS ((void)); -extern void define_automatic_variables PARAMS ((void)); -extern void initialize_file_variables PARAMS ((struct file *file, int read)); -extern void print_file_variables PARAMS ((struct file *file)); -extern void print_variable_set PARAMS ((struct variable_set *set, char *prefix)); -extern void merge_variable_set_lists PARAMS ((struct variable_set_list **to_list, struct variable_set_list *from_list)); -extern struct variable *do_variable_definition PARAMS ((const struct floc *flocp, const char *name, char *value, enum variable_origin origin, enum variable_flavor flavor, int target_var)); -extern struct variable *parse_variable_definition PARAMS ((struct variable *v, char *line)); -extern struct variable *try_variable_definition PARAMS ((const struct floc *flocp, char *line, enum variable_origin origin, int target_var)); -extern void init_hash_global_variable_set PARAMS ((void)); -extern void hash_init_function_table PARAMS ((void)); -extern struct variable *lookup_variable PARAMS ((const char *name, unsigned int length)); -extern struct variable *lookup_variable_in_set PARAMS ((const char *name, - unsigned int length, - const struct variable_set *set)); - -extern struct variable *define_variable_in_set - PARAMS ((const char *name, unsigned int length, char *value, - enum variable_origin origin, int recursive, - struct variable_set *set, const struct 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 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) - -/* Warn that NAME is an undefined variable. */ - -#define warn_undefined(n,l) do{\ - if (warn_undefined_variables_flag) \ - error (reading_file, \ - _("warning: undefined variable `%.*s'"), \ - (int)(l), (n)); \ - }while(0) - -extern char **target_environment PARAMS ((struct file *file)); - -extern struct pattern_var *create_pattern_var PARAMS ((char *target, char *suffix)); - -extern int export_all_variables; - -#define MAKELEVEL_NAME "MAKELEVEL" -#define MAKELEVEL_LENGTH (sizeof (MAKELEVEL_NAME) - 1) diff --git a/src/gmake/version.c b/src/gmake/version.c deleted file mode 100644 index 1918b6f7..00000000 --- a/src/gmake/version.c +++ /dev/null @@ -1,17 +0,0 @@ -/* 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 make.h was found in $srcdir). */ -#include - -#ifndef MAKE_HOST -# define MAKE_HOST "unknown" -#endif - -char *version_string = VERSION; -char *make_host = MAKE_HOST; - -/* - Local variables: - version-control: never - End: - */ diff --git a/src/gmake/vmsdir.h b/src/gmake/vmsdir.h deleted file mode 100644 index 59034759..00000000 --- a/src/gmake/vmsdir.h +++ /dev/null @@ -1,61 +0,0 @@ -/* dirent.h for vms */ - -#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 /* compatability */ - - -/* - * 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 - -extern DIR *opendir PARAMS (()); -extern struct direct *readdir PARAMS ((DIR *dfd)); -#define rewinddir(dirp) seekdir((dirp), (long)0) -extern int closedir PARAMS ((DIR *dfd)); -extern char *vmsify PARAMS ((char *name, int type)); - -#endif /* VMSDIR_H */ diff --git a/src/gmake/vmsfunctions.c b/src/gmake/vmsfunctions.c deleted file mode 100644 index 48cb9a5e..00000000 --- a/src/gmake/vmsfunctions.c +++ /dev/null @@ -1,252 +0,0 @@ -/* vmsfunctions.c */ - -#include "make.h" -#include "debug.h" - -#ifdef __DECC -#include -#endif -#include -#include -#include -#include -#include -#include "vmsdir.h" - -#ifdef HAVE_VMSDIR_H - -DIR * -opendir (char *dspec) -{ - struct DIR *dir = (struct DIR *)xmalloc (sizeof (struct DIR)); - struct NAM *dnam = (struct NAM *)xmalloc (sizeof (struct NAM)); - struct FAB *dfab = &dir->fab; - char *searchspec = (char *)xmalloc (MAXNAMLEN + 1); - - memset (dir, 0, sizeof *dir); - - *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'; - uppercasify (dentry->d_name); - - 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 */ - -char * -getwd (char *cwd) -{ - static char buf[512]; - - if (cwd) - return (getcwd (cwd, 512)); - else - return (getcwd (buf, 512)); -} - -int -vms_stat (char *name, struct stat *buf) -{ - int status; - int i; - - static struct FAB Fab; - static struct NAM Nam; - static struct fibdef Fib; /* short fib */ - static struct dsc$descriptor FibDesc = - { sizeof (Fib), DSC$K_DTYPE_Z, DSC$K_CLASS_S, (char *) &Fib }; - static struct dsc$descriptor_s DevDesc = - { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, &Nam.nam$t_dvi[1] }; - static char EName[NAM$C_MAXRSS]; - static char RName[NAM$C_MAXRSS]; - static struct dsc$descriptor_s FileName = - { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0 }; - static struct dsc$descriptor_s string = - { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0 }; - static unsigned long Rdate[2]; - static unsigned long Cdate[2]; - static struct atrdef Atr[] = - { -#if defined(VAX) - /* Revision date */ - { sizeof (Rdate), ATR$C_REVDATE, (unsigned int) &Rdate[0] }, - /* Creation date */ - { sizeof (Cdate), ATR$C_CREDATE, (unsigned int) &Cdate[0] }, -#else - /* Revision date */ - { sizeof (Rdate), ATR$C_REVDATE, &Rdate[0] }, - /* Creation date */ - { sizeof (Cdate), ATR$C_CREDATE, &Cdate[0]}, -#endif - { 0, 0, 0 } - }; - static short int DevChan; - static short int iosb[4]; - - name = vmsify (name, 0); - - /* initialize RMS structures, we need a NAM to retrieve the FID */ - Fab = cc$rms_fab; - Fab.fab$l_fna = name; /* name of file */ - Fab.fab$b_fns = strlen (name); - Fab.fab$l_nam = &Nam; /* FAB has an associated NAM */ - - Nam = cc$rms_nam; - Nam.nam$l_esa = EName; /* expanded filename */ - Nam.nam$b_ess = sizeof (EName); - Nam.nam$l_rsa = RName; /* resultant filename */ - Nam.nam$b_rss = sizeof (RName); - - /* do $PARSE and $SEARCH here */ - status = sys$parse (&Fab); - if (!(status & 1)) - return -1; - - DevDesc.dsc$w_length = Nam.nam$t_dvi[0]; - status = sys$assign (&DevDesc, &DevChan, 0, 0); - if (!(status & 1)) - return -1; - - FileName.dsc$a_pointer = Nam.nam$l_name; - FileName.dsc$w_length = Nam.nam$b_name + Nam.nam$b_type + Nam.nam$b_ver; - - /* Initialize the FIB */ - for (i = 0; i < 3; i++) - { -#ifndef __VAXC - Fib.fib$w_fid[i] = Nam.nam$w_fid[i]; - Fib.fib$w_did[i] = Nam.nam$w_did[i]; -#else - Fib.fib$r_fid_overlay.fib$w_fid[i] = Nam.nam$w_fid[i]; - Fib.fib$r_did_overlay.fib$w_did[i] = Nam.nam$w_did[i]; -#endif - } - - status = sys$qiow (0, DevChan, IO$_ACCESS, &iosb, 0, 0, - &FibDesc, &FileName, 0, 0, &Atr, 0); - sys$dassgn (DevChan); - if (!(status & 1)) - return -1; - status = iosb[0]; - if (!(status & 1)) - return -1; - - status = stat (name, buf); - if (status) - return -1; - - buf->st_mtime = ((Rdate[0] >> 24) & 0xff) + ((Rdate[1] << 8) & 0xffffff00); - buf->st_ctime = ((Cdate[0] >> 24) & 0xff) + ((Cdate[1] << 8) & 0xffffff00); - - return 0; -} - -char * -cvt_time (unsigned long tval) -{ - static long int date[2]; - static char str[27]; - static struct dsc$descriptor date_str = - { 26, DSC$K_DTYPE_T, DSC$K_CLASS_S, str }; - - date[0] = (tval & 0xff) << 24; - date[1] = ((tval >> 8) & 0xffffff); - - if ((date[0] == 0) && (date[1] == 0)) - return ("never"); - - sys$asctim (0, &date_str, date, 0); - str[26] = '\0'; - - return (str); -} - -int -strcmpi (const char *s1, const char *s2) -{ - while (*s1 != '\0' && toupper(*s1) == toupper(*s2)) - { - s1++; - s2++; - } - - return toupper(*(unsigned char *) s1) - toupper(*(unsigned char *) s2); -} diff --git a/src/gmake/vmsify.c b/src/gmake/vmsify.c deleted file mode 100644 index d8d3d85a..00000000 --- a/src/gmake/vmsify.c +++ /dev/null @@ -1,979 +0,0 @@ -/* - vmsify.c - - Module for vms <-> unix file name conversion - - Written by Klaus Kämpf (kkaempf@progis.de) - of proGIS Software, Aachen, Germany - -*/ - -#include -#include -#include - -#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, char **from, char upto, int as_dir) -{ - 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 - { - if (isupper ((unsigned char)**from)) - **to = tolower ((unsigned char)**from); - else - **to = **from; - } - (*to)++; - (*from)++; - } - - return 0; -} - - -/* - get translation of logical name - -*/ - -static char * -trnlog (char *name) -{ - int stat; - static char reslt[1024]; - $DESCRIPTOR (reslt_dsc, reslt); - short resltlen; - struct dsc$descriptor_s name_dsc; - char *s; - - INIT_DSC_CSTRING (name_dsc, name); - - stat = lib$sys_trnlog (&name_dsc, &resltlen, &reslt_dsc); - - if ((stat&1) == 0) - { - return ""; - } - if (stat == SS$_NOTRAN) - { - return ""; - } - reslt[resltlen] = '\0'; - - s = (char *)malloc (resltlen+1); - if (s == 0) - return ""; - 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 -*/ - -char * -vmsify (char *name, int type) -{ -/* max 255 device - max 39 directory - max 39 filename - max 39 filetype - max 5 version -*/ -#define MAXPATHLEN 512 - - enum namestate nstate; - static char vmsname[MAXPATHLEN+1]; - char *fptr; - char *vptr; - char *s,*s1; - int as_dir; - int count; - - if (name == 0) - return 0; - fptr = name; - vptr = vmsname; - nstate = N_START; - - /* case 25a */ - - s = strpbrk (name, "$:"); - if (s != 0) - { - char *s1; - char *s2; - - if (type == 1) - { - s1 = strchr (s+1, '['); - s2 = strchr (s+1, ']'); - } - - if (*s == '$') - { - if (strchr (name, '/') == 0) - { - if ((type == 1) && (s1 != 0) && (s2 == 0)) - { - strcpy (vmsname, name); - strcat (vmsname, "]"); - return vmsname; - } - else - return name; - } - } - else - { - if ((type == 1) && (s1 != 0) && (s2 == 0)) - { - strcpy (vmsname, name); - strcat (vmsname, "]"); - return vmsname; - } - else - return name; - } - } - - /* case 26 */ - - s = strchr (name, '['); - - if (s != 0) - { - s1 = strchr (s+1, '['); - if (s1 == 0) - { - if ((type == 1) - && (strchr (s+1, ']') == 0)) - { - strcpy (vmsname, name); - strcat (vmsname, "]"); - return vmsname; - } - else - return name; /* single [, keep unchanged */ - } - s1--; - if (*s1 != ']') - { - return name; /* 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; - int rooted = 1; /* flag if logical is rooted, else insert [000000] */ - - state = 0; - - 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 */ - 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 */ - while (*fptr == '/') /* collapse all '/' */ - fptr++; - if (*fptr == 0) /* just // */ - { - char cwdbuf[MAXPATHLEN+1]; - - s1 = getcwd(cwdbuf, MAXPATHLEN); - if (s1 == 0) - { - return ""; /* FIXME, err getcwd */ - } - s = strchr (s1, ':'); - if (s == 0) - { - return ""; /* 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 */ - s1 = trnlog (s); - if (*s1 != 0) - { /* found translation */ - char *s2; - for (;;) /* loop over all nested logicals */ - { - s2 = s1 + strlen (s1) - 1; - if (*s2 == ':') /* translation ends in ':' */ - { - s2 = trnlog (s1); - free (s1); - if (*s2 == 0) - { - rooted = 0; - break; - } - s1 = s2; - continue; /* next iteration */ - } - if (*s2 == ']') /* translation ends in ']' */ - { - if (*(s2-1) == '.') /* ends in '.]' */ - { - if (strncmp (fptr, "000000", 6) != 0) - rooted = 0; - } - else - { - strcpy (vmsname, s1); - s = strchr (vmsname, ']'); - *s = '.'; - nstate = N_DOT; - vptr = s; - } - } - break; - } - free (s1); - } - else - rooted = 0; - - if (*vptr == 0) - { - nstate = N_DEVICE; - *vptr++ = ':'; - } - else - vptr++; - - if (rooted == 0) - { - strcpy (vptr, "[000000."); - vptr += 8; - s1 = vptr-1; - nstate = N_DOT; - } - else - s1 = 0; - - /* s1-> '.' 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) - && (s1 != 0) - && (*(s+1) == 0)) - { - if (type == 2) - { - *s1 = ']'; - 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 */ - *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)) - { - s = vptr-1; - while (s > vmsname) - { - if (*s == ']') - { - break; - } - if (*s == '.') - { - *s = ']'; - break; - } - s--; - } - } - strcpy (vptr, ".dir"); - vptr += 4; - state = -1; - break; - - case 8: /* add ']' and exit */ - *vptr++ = ']'; - state = -1; - break; - - case 9: /* 17..21, fptr -> 1st '/' + 1 */ - 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)) ) - { - fptr += 2; - if (*fptr == '/') - { - do - { - fptr++; - } - while (*fptr == '/'); - } - else if (*fptr == 0) - type = 1; - vptr--; /* vptr -> '.' or ']' */ - s1 = vptr; - for (;;) - { - s1--; - if (*s1 == '.') /* one back */ - { - vptr = s1; - nstate = N_OPEN; - break; - } - if (*s1 == '[') /* top level reached */ - { - if (*fptr == 0) - { - strcpy (s1, "[000000]"); - vptr = s1 + 8; - nstate = N_CLOSED; - s = 0; - break; - } - else - { - vptr = s1+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 */ - { - return name; - } - 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 cwdbuf[MAXPATHLEN+1]; - - s1 = getcwd(cwdbuf, MAXPATHLEN); - if (s1 == 0) - { - return ""; /* FIXME, err getcwd */ - } - strcpy (vptr, s1); - s = strchr (vptr, ']'); - if (s != 0) - { - nstate = N_OPEN; - while (s > vptr) - { - s--; - if (*s == '[') - { - s++; - strcpy (s, "000000]"); - state = -1; - break; - } - else if (*s == '.') - { - if (--count == 0) - { - if (*fptr == 0) /* had '..' or '../' */ - { - *s++ = ']'; - state = -1; - } - else /* had '../xxx' */ - { - state = 9; - } - *s = 0; - break; - } - } - } - } - vptr += strlen (vptr); - } - break; - - case 12: /* 1, '.' at start */ - if (*fptr != 0) - { - if (*fptr != '/') - { - return name; - } - while (*fptr == '/') - fptr++; - } - - { - char cwdbuf[MAXPATHLEN+1]; - - s1 = getcwd(cwdbuf, MAXPATHLEN); - if (s1 == 0) - { - return ""; /*FIXME, err getcwd */ - } - strcpy (vptr, s1); - if (*fptr == 0) - { - state = -1; - break; - } - else - { - s = strchr (vptr, ']'); - if (s == 0) - { - state = -1; - break; - } - *s = 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/ -*/ - -char * -unixify (char *name) -{ - static char piece[512]; - char *s, *p; - - if (strchr (name, '/') != 0) /* already in unix style */ - return name; - - p = piece; - *p = 0; - - /* device part */ - - s = strchr (name, ':'); - - if (s != 0) - { - *s = 0; - *p++ = '/'; - *p++ = '/'; - strcpy (p, name); - p += strlen (p); - *s = ':'; - } - - /* directory part */ - - *p++ = '/'; - s = strchr (name, '['); - - if (s != 0) - { - s++; - switch (*s) - { - case ']': /* [] */ - strcat (p, "./"); - break; - case '-': /* [- */ - strcat (p, "../"); - break; - case '.': - strcat (p, "./"); /* [. */ - break; - default: - s--; - break; - } - s++; - while (*s) - { - if (*s == '.') - *p++ = '/'; - else - *p++ = *s; - s++; - if (*s == ']') - { - s++; - break; - } - } - if (*s != 0) /* more after ']' ?? */ - { - if (*(p-1) != '/') - *p++ = '/'; - strcpy (p, s); /* copy it anyway */ - } - } - - else /* no '[' anywhere */ - - { - *p++ = 0; - } - - /* force end with '/' */ - - if (*(p-1) != '/') - *p++ = '/'; - *p = 0; - - return piece; -} - -/* EOF */ diff --git a/src/gmake/vpath.c b/src/gmake/vpath.c deleted file mode 100644 index 7dae82d7..00000000 --- a/src/gmake/vpath.c +++ /dev/null @@ -1,586 +0,0 @@ -/* Implementation of pattern-matching file search paths for GNU Make. -Copyright (C) 1988,89,91,92,93,94,95,96,97 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ - -#include "make.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. */ - char *pattern; /* The pattern to match. */ - char *percent; /* Pointer into `pattern' where the `%' is. */ - unsigned int patlen;/* Length of the pattern. */ - 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; - -static int selective_vpath_search PARAMS ((struct vpath *path, char **file, FILE_TIMESTAMP *mtime_ptr)); - -/* 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; - - /* 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 ("%", 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; - - /* 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 ("%", 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 searchpath 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 SEARCHPATH 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 searchpath - separated by the path element separator (defined in make.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) -{ - register unsigned int elem; - register char *p; - register char **vpath; - register unsigned int maxvpath; - unsigned int maxelem; - char *percent = NULL; - - if (pattern != 0) - { - pattern = xstrdup (pattern); - percent = find_percent (pattern); - } - - if (dirpath == 0) - { - /* Remove matching listings. */ - register 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. */ - free (path->pattern); - free ((char *) path->searchpath); - free ((char *) path); - } - else - lastpath = path; - - path = next; - } - - if (pattern != 0) - free (pattern); - return; - } - -#ifdef WINDOWS32 - convert_vpath_to_windows32(dirpath, ';'); -#endif - - /* 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 = (char **) xmalloc (maxelem * sizeof (char *)); - maxvpath = 0; - - /* Skip over any initial separators and blanks. */ - p = dirpath; - while (*p == PATH_SEPARATOR_CHAR || isblank ((unsigned char)*p)) - ++p; - - elem = 0; - while (*p != '\0') - { - char *v; - unsigned int len; - - /* Find the end of this entry. */ - v = p; - while (*p != '\0' && *p != PATH_SEPARATOR_CHAR - && !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__) - /* 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; - - if (len > 1 || *v != '.') - { - v = savestring (v, len); - - /* Verify that the directory actually exists. */ - - if (dir_file_exists_p (v, "")) - { - /* It does. Put it in the list. */ - vpath[elem++] = dir_name (v); - free (v); - if (len > maxvpath) - maxvpath = len; - } - else - /* The directory does not exist. Omit from the list. */ - free (v); - } - - /* 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 = (char **) xrealloc ((char *) vpath, - (elem + 1) * sizeof (char *)); - - /* Put the nil-pointer terminator on the end of the VPATH list. */ - vpath[elem] = 0; - - /* Construct the vpath structure and put it into the linked list. */ - path = (struct vpath *) xmalloc (sizeof (struct vpath)); - path->searchpath = vpath; - path->maxlen = maxvpath; - path->next = vpaths; - vpaths = path; - - /* Set up the members. */ - path->pattern = pattern; - path->percent = percent; - path->patlen = strlen (pattern); - } - else - { - /* There were no entries, so free whatever space we allocated. */ - free ((char *) vpath); - if (pattern != 0) - free (pattern); - } -} - -/* 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 (char *file, int len) -{ - register char **gp; - - if (gpaths && (len <= gpaths->maxlen)) - for (gp = gpaths->searchpath; *gp != NULL; ++gp) - if (strneq (*gp, file, len) && (*gp)[len] == '\0') - return 1; - - return 0; -} - -/* Search the VPATH list whose pattern matches *FILE for a directory - where the name pointed to by FILE exists. If it is found, we set *FILE to - the newly malloc'd name of the existing file, *MTIME_PTR (if MTIME_PTR is - not NULL) to its modtime (or zero if no stat call was done), and return 1. - Otherwise we return 0. */ - -int -vpath_search (char **file, FILE_TIMESTAMP *mtime_ptr) -{ - register struct vpath *v; - - /* If there are no VPATH entries or FILENAME starts at the root, - there is nothing we can do. */ - - if (**file == '/' -#ifdef HAVE_DOS_PATHS - || **file == '\\' - || (*file)[1] == ':' -#endif - || (vpaths == 0 && general_vpath == 0)) - return 0; - - for (v = vpaths; v != 0; v = v->next) - if (pattern_matches (v->pattern, v->percent, *file)) - if (selective_vpath_search (v, file, mtime_ptr)) - return 1; - - if (general_vpath != 0 - && selective_vpath_search (general_vpath, file, mtime_ptr)) - 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 set *FILE to the newly malloc'd - name of the existing file, *MTIME_PTR (if MTIME_PTR is not NULL) to - its modtime (or zero if no stat call was done), and we return 1. - Otherwise we return 0. */ - -static int -selective_vpath_search (struct vpath *path, char **file, - FILE_TIMESTAMP *mtime_ptr) -{ - int not_target; - char *name, *n; - char *filename; - register char **vpath = path->searchpath; - unsigned int maxvpath = path->maxlen; - register unsigned int i; - unsigned int flen, vlen, 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. */ - { - 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; - - /* Allocate 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 = (char *) xmalloc (maxvpath + 1 + name_dplen + 1 + flen + 1); - - /* Try each VPATH entry. */ - for (i = 0; vpath[i] != 0; ++i) - { - int exists_in_cache = 0; - - n = name; - - /* Put the next VPATH entry into NAME at N and increment N past it. */ - vlen = strlen (vpath[i]); - bcopy (vpath[i], n, vlen); - n += vlen; - - /* Add the directory prefix already in *FILE. */ - if (name_dplen > 0) - { -#ifndef VMS - *n++ = '/'; -#endif - bcopy (*file, n, name_dplen); - n += name_dplen; - } - -#ifdef HAVE_DOS_PATHS - /* Cause the next if to treat backslash and slash alike. */ - if (n != name && n[-1] == '\\' ) - n[-1] = '/'; -#endif - /* Now add the name-within-directory at the end of NAME. */ -#ifndef VMS - if (n != name && n[-1] != '/') - { - *n = '/'; - bcopy (filename, n + 1, flen + 1); - } - else -#endif - bcopy (filename, n, 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. */ - { - struct file *f = lookup_file (name); - if (f != 0) - exists = not_target || f->is_target; - } - - 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. */ - *n = '\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. */ - *n = '/'; -#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; - } - } - - /* We have found a file. - Store the name we found into *FILE for the caller. */ - - *file = savestring (name, (n + 1 - name) + flen); - - if (mtime_ptr != 0) - /* Store the modtime into *MTIME_PTR for the caller. - If we have had no need to stat the file here, - we record UNKNOWN_MTIME to indicate this. */ - *mtime_ptr = (exists_in_cache - ? FILE_TIMESTAMP_STAT_MODTIME (name, st) - : UNKNOWN_MTIME); - - free (name); - return 1; - } - } - - free (name); - return 0; -} - -/* Print the data base of VPATH search paths. */ - -void -print_vpath_data_base (void) -{ - register unsigned int nvpaths; - register 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 - { - register char **path = general_vpath->searchpath; - register unsigned int i; - - fputs (_("\n# General (`VPATH' variable) search path:\n# "), stdout); - - for (i = 0; path[i] != 0; ++i) - printf ("%s%c", path[i], - path[i + 1] == 0 ? '\n' : PATH_SEPARATOR_CHAR); - } -} diff --git a/src/gmake/w32/compat/dirent.c b/src/gmake/w32/compat/dirent.c deleted file mode 100644 index 566fba97..00000000 --- a/src/gmake/w32/compat/dirent.c +++ /dev/null @@ -1,188 +0,0 @@ -#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 = -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/src/gmake/w32/include/dirent.h b/src/gmake/w32/include/dirent.h deleted file mode 100644 index ed182b34..00000000 --- a/src/gmake/w32/include/dirent.h +++ /dev/null @@ -1,62 +0,0 @@ -/* Windows version of dirent.h -Copyright (C) 1996, 1997, 2003 Free Software Foundation, Inc. -This file is part of GNU Make. - -GNU Make is free software; you can 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. - -GNU Make is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GNU Make; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, -MA 02111-1307, USA. */ - -#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/src/gmake/w32/include/pathstuff.h b/src/gmake/w32/include/pathstuff.h deleted file mode 100644 index a036f7b2..00000000 --- a/src/gmake/w32/include/pathstuff.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef _PATHSTUFF_H -#define _PATHSTUFF_H - -extern char * convert_Path_to_windows32(char *Path, char to_delim); -extern char * convert_vpath_to_windows32(char *Path, char to_delim); -extern char * w32ify(char *file, int resolve); -extern char * getcwd_fs(char *buf, int len); - -#endif diff --git a/src/gmake/w32/include/sub_proc.h b/src/gmake/w32/include/sub_proc.h deleted file mode 100644 index d7c57a2e..00000000 --- a/src/gmake/w32/include/sub_proc.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef SUB_PROC_H -#define SUB_PROC_H - -/* - * Component Name: - * - * $Date: 1997/08/27 20:34:23 $ - * - * $Source: /cvsroot/make/make/w32/include/sub_proc.h,v $ - * - * $Revision: 1.4 $ - */ - -/* $Id: sub_proc.h,v 1.4 1997/08/27 20:34:23 psmith Exp $ */ - -#ifdef WINDOWS32 - -#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, (VOID_DECL)); -EXTERN_DECL(void process_register, (HANDLE proc)); -EXTERN_DECL(HANDLE process_easy, (char** argv, char** env)); -EXTERN_DECL(BOOL process_kill, (HANDLE proc, int signal)); - -/* support routines */ -EXTERN_DECL(long process_errno, (HANDLE proc)); -EXTERN_DECL(long process_last_err, (HANDLE proc)); -EXTERN_DECL(long process_exit_code, (HANDLE proc)); -EXTERN_DECL(long process_signal, (HANDLE proc)); -EXTERN_DECL(char * process_outbuf, (HANDLE proc)); -EXTERN_DECL(char * process_errbuf, (HANDLE proc)); -EXTERN_DECL(int process_outcnt, (HANDLE proc)); -EXTERN_DECL(int process_errcnt, (HANDLE proc)); -EXTERN_DECL(void process_pipes, (HANDLE proc, int pipes[3])); - -#endif -#endif diff --git a/src/gmake/w32/include/w32err.h b/src/gmake/w32/include/w32err.h deleted file mode 100644 index 263908df..00000000 --- a/src/gmake/w32/include/w32err.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef _W32ERR_H_ -#define _W32ERR_H_ - -#ifndef EXTERN_DECL -#define EXTERN_DECL(entry, args) entry args -#endif - -EXTERN_DECL(char * map_windows32_error_to_string, (DWORD error)); - -#endif /* !_W32ERR_H */ diff --git a/src/gmake/w32/pathstuff.c b/src/gmake/w32/pathstuff.c deleted file mode 100644 index d8f38453..00000000 --- a/src/gmake/w32/pathstuff.c +++ /dev/null @@ -1,238 +0,0 @@ -#include -#include -#include "make.h" -#include "pathstuff.h" - -/* - * Convert delimiter separated vpath to Canonical format. - */ -char * -convert_vpath_to_windows32(char *Path, char to_delim) -{ - char *etok; /* token separator for old Path */ - - /* - * Convert all spaces to delimiters. Note that pathnames which - * contain blanks get trounced here. Use 8.3 format as a workaround. - */ - for (etok = Path; etok && *etok; etok++) - if (isblank ((unsigned char) *etok)) - *etok = to_delim; - - return (convert_Path_to_windows32(Path, to_delim)); -} - -/* - * Convert delimiter separated path to Canonical format. - */ -char * -convert_Path_to_windows32(char *Path, char to_delim) -{ - char *etok; /* token separator for old Path */ - char *p; /* points to element of old Path */ - - /* is this a multi-element Path ? */ - 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 { - /* found another one, no drive letter */ - *etok = to_delim; - p = ++etok; - } - - return Path; -} - -/* - * Convert to forward slashes. Resolve to full pathname optionally - */ -char * -w32ify(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; - - if (p = getcwd(buf, len)) { - char *q = w32ify(buf, 0); - strncpy(buf, q, len); - } - - return p; -} - -#ifdef unused -/* - * Convert delimiter separated pathnames (e.g. PATH) or single file pathname - * (e.g. c:/foo, c:\bar) to NutC format. If we are handed a string that - * _NutPathToNutc() fails to convert, just return the path we were handed - * and assume the caller will know what to do with it (It was probably - * a mistake to try and convert it anyway due to some of the bizarre things - * that might look like pathnames in makefiles). - */ -char * -convert_path_to_nutc(char *path) -{ - int count; /* count of path elements */ - char *nutc_path; /* new NutC path */ - int nutc_path_len; /* length of buffer to allocate for new path */ - char *pathp; /* pointer to nutc_path used to build it */ - char *etok; /* token separator for old path */ - char *p; /* points to element of old path */ - char sep; /* what flavor of separator used in old path */ - char *rval; - - /* is this a multi-element path ? */ - for (p = path, etok = strpbrk(p, ":;"), count = 0; - etok; - etok = strpbrk(p, ":;")) - if ((etok - p) == 1) { - if (*(etok - 1) == ';' || - *(etok - 1) == ':') { - p = ++etok; - continue; /* ignore empty bucket */ - } else if (etok = strpbrk(etok+1, ":;")) - /* found one to count, handle drive letter */ - p = ++etok, count++; - else - /* all finished, force abort */ - p += strlen(p); - } else - /* found another one, no drive letter */ - p = ++etok, count++; - - if (count) { - count++; /* x1;x2;x3 <- need to count x3 */ - - /* - * Hazard a guess on how big the buffer needs to be. - * We have to convert things like c:/foo to /c=/foo. - */ - nutc_path_len = strlen(path) + (count*2) + 1; - nutc_path = xmalloc(nutc_path_len); - pathp = nutc_path; - *pathp = '\0'; - - /* - * Loop through PATH and convert one elemnt of the path at at - * a time. Single file pathnames will fail this and fall - * to the logic below loop. - */ - for (p = path, etok = strpbrk(p, ":;"); - etok; - etok = strpbrk(p, ":;")) { - - /* don't trip up on device specifiers or empty path slots */ - if ((etok - p) == 1) - if (*(etok - 1) == ';' || - *(etok - 1) == ':') { - p = ++etok; - continue; - } else if ((etok = strpbrk(etok+1, ":;")) == NULL) - break; /* thing found was a WINDOWS32 pathname */ - - /* save separator */ - sep = *etok; - - /* terminate the current path element -- temporarily */ - *etok = '\0'; - -#ifdef __NUTC__ - /* convert to NutC format */ - if (_NutPathToNutc(p, pathp, 0) == FALSE) { - free(nutc_path); - rval = savestring(path, strlen(path)); - return rval; - } -#else - *pathp++ = '/'; - *pathp++ = p[0]; - *pathp++ = '='; - *pathp++ = '/'; - strcpy(pathp, &p[2]); -#endif - - pathp += strlen(pathp); - *pathp++ = ':'; /* use Unix style path separtor for new path */ - *pathp = '\0'; /* make sure we are null terminaed */ - - /* restore path separator */ - *etok = sep; - - /* point p to first char of next path element */ - p = ++etok; - - } - } else { - nutc_path_len = strlen(path) + 3; - nutc_path = xmalloc(nutc_path_len); - pathp = nutc_path; - *pathp = '\0'; - p = path; - } - - /* - * OK, here we handle the last element in PATH (e.g. c of a;b;c) - * or the path was a single filename and will be converted - * here. Note, testing p here assures that we don't trip up - * on paths like a;b; which have trailing delimiter followed by - * nothing. - */ - if (*p != '\0') { -#ifdef __NUTC__ - if (_NutPathToNutc(p, pathp, 0) == FALSE) { - free(nutc_path); - rval = savestring(path, strlen(path)); - return rval; - } -#else - *pathp++ = '/'; - *pathp++ = p[0]; - *pathp++ = '='; - *pathp++ = '/'; - strcpy(pathp, &p[2]); -#endif - } else - *(pathp-1) = '\0'; /* we're already done, don't leave trailing : */ - - rval = savestring(nutc_path, strlen(nutc_path)); - free(nutc_path); - return rval; -} - -#endif diff --git a/src/gmake/w32/subproc/NMakefile b/src/gmake/w32/subproc/NMakefile deleted file mode 100644 index 66afe650..00000000 --- a/src/gmake/w32/subproc/NMakefile +++ /dev/null @@ -1,60 +0,0 @@ -# NOTE: If you have no `make' program at all to process this makefile, run -# `build.bat' instead. -# -# Copyright (C) 1988,89,91,92,93,94,95,96,97 Free Software Foundation, Inc -# This file is part of GNU Make. -# -# GNU Make is free software; you can 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. -# -# GNU Make is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GNU Make; see the file COPYING. If not, write to -# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -# -# NMakefile for GNU Make (subproc library) -# -LIB = lib -CC = cl - -OUTDIR=. -MAKEFILE=NMakefile - -CFLAGS_any = /nologo /MT /W3 /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/src/gmake/w32/subproc/build.bat b/src/gmake/w32/subproc/build.bat deleted file mode 100644 index 8e3ab089..00000000 --- a/src/gmake/w32/subproc/build.bat +++ /dev/null @@ -1,10 +0,0 @@ -if not exist .\WinDebug\nul mkdir .\WinDebug -cl.exe /nologo /MT /W3 /GX /Z7 /YX /Od /I .. /I . /I ../include /D WIN32 /D WINDOWS32 /D _DEBUG /D _WINDOWS /FR.\WinDebug/ /Fp.\WinDebug/subproc.pch /Fo.\WinDebug/ /c misc.c -cl.exe /nologo /MT /W3 /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 /W3 /GX /Z7 /YX /Od /I .. /I . /I ../include /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 /W3 /GX /YX /O2 /I ../include /D WIN32 /D WINDOWS32 /D NDEBUG /D _WINDOWS /FR.\WinRel/ /Fp.\WinRel/subproc.pch /Fo.\WinRel/ /c misc.c -cl.exe /nologo /MT /W3 /GX /YX /O2 /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 /W3 /GX /YX /O2 /I ../include /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 diff --git a/src/gmake/w32/subproc/misc.c b/src/gmake/w32/subproc/misc.c deleted file mode 100644 index 7e32652c..00000000 --- a/src/gmake/w32/subproc/misc.c +++ /dev/null @@ -1,65 +0,0 @@ -#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) -{ - 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 = 0; - while (arr[arrcnt]) { - tmp[arrcnt] = arr[arrcnt]; - size_needed += strlen(arr[arrcnt]) + 1; - arrcnt++; - } - size_needed++; - - qsort((void *) tmp, (size_t) arrcnt, sizeof (char*), compare); - - ptr = *envblk_out = calloc(size_needed, 1); - if (!ptr) { - free(tmp); - return FALSE; - } - - arrcnt = 0; - while (tmp[arrcnt]) { - strcpy(ptr, tmp[arrcnt]); - ptr += strlen(tmp[arrcnt]) + 1; - arrcnt++; - } - - free(tmp); - return TRUE; -} diff --git a/src/gmake/w32/subproc/proc.h b/src/gmake/w32/subproc/proc.h deleted file mode 100644 index ce7a14f1..00000000 --- a/src/gmake/w32/subproc/proc.h +++ /dev/null @@ -1,13 +0,0 @@ -#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); - -#endif diff --git a/src/gmake/w32/subproc/sub_proc.c b/src/gmake/w32/subproc/sub_proc.c deleted file mode 100644 index 52f2fa2c..00000000 --- a/src/gmake/w32/subproc/sub_proc.c +++ /dev/null @@ -1,1207 +0,0 @@ -#include -#include -#include /* for msvc _beginthreadex, _endthreadex */ -#include - -#include "sub_proc.h" -#include "proc.h" -#include "w32err.h" -#include "config.h" -#include "debug.h" - -static char *make_command_line(char *shell_name, char *exec_path, char **argv); - -typedef struct sub_process_t { - int sv_stdin[2]; - int sv_stdout[2]; - int sv_stderr[2]; - int using_pipes; - char *inp; - DWORD incnt; - char * volatile outp; - volatile DWORD outcnt; - char * volatile errp; - volatile DWORD errcnt; - int 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[256]; -static int proc_index = 0; -static int fake_exits_pending = 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(void) -{ - HANDLE handles[256]; - 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, INFINITE); - which = retval - WAIT_OBJECT_0; - } else { - fake_exits_pending--; - retval = !WAIT_FAILED; - which = i; - } - - /* return pointer to process */ - if (retval != WAIT_FAILED) { - sub_process* pproc = proc_array[which]; - process_adjust_wait_state(pproc); - return pproc; - } else - return NULL; -} - -/* - * 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) -{ - proc_array[proc_index++] = (sub_process *) proc; -} - -/* - * Public function which works kind of like waitpid(). Wait for any - * of the children to die and return results. To call this function, - * you must do 1 of things: - * - * x = process_easy(...); - * - * or - * - * x = process_init_fd(); - * process_register(x); - * - * or - * - * x = process_init(); - * process_register(x); - * - * You must NOT then call process_pipe_io() because this function is - * not capable of handling automatic notification of any child - * death. - */ - -HANDLE -process_wait_for_any(void) -{ - sub_process* pproc = process_wait_for_any_private(); - - 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_errno(HANDLE proc) -{ - return (((sub_process *)proc)->lerrno); -} - -long -process_signal(HANDLE proc) -{ - return (((sub_process *)proc)->signal); -} - - long -process_last_err(HANDLE proc) -{ - return (((sub_process *)proc)->last_err); -} - - long -process_exit_code(HANDLE proc) -{ - return (((sub_process *)proc)->exit_code); -} - - 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] = (int) stdin_pipes[0]; - pproc->sv_stdin[1] = (int) stdin_pipes[1]; - pproc->sv_stdout[0] = (int) stdout_pipes[0]; - pproc->sv_stdout[1] = (int) stdout_pipes[1]; - pproc->sv_stderr[0] = (int) stderr_pipes[0]; - pproc->sv_stderr[1] = (int) 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)); - 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] = (int) stdinh; - pproc->sv_stdout[1] = (int) stdouth; - pproc->sv_stderr[1] = (int) stderrh; - - pproc->last_err = pproc->lerrno = 0; - - return((HANDLE)pproc); -} - - -static HANDLE -find_file(char *exec_path, LPOFSTRUCT file_info) -{ - HANDLE exec_handle; - char *fname; - char *ext; - - fname = malloc(strlen(exec_path) + 5); - strcpy(fname, exec_path); - ext = fname + strlen(fname); - - strcpy(ext, ".exe"); - if ((exec_handle = (HANDLE)OpenFile(fname, file_info, - OF_READ | OF_SHARE_COMPAT)) != (HANDLE)HFILE_ERROR) { - free(fname); - return(exec_handle); - } - - strcpy(ext, ".cmd"); - if ((exec_handle = (HANDLE)OpenFile(fname, file_info, - OF_READ | OF_SHARE_COMPAT)) != (HANDLE)HFILE_ERROR) { - free(fname); - return(exec_handle); - } - - strcpy(ext, ".bat"); - if ((exec_handle = (HANDLE)OpenFile(fname, file_info, - OF_READ | OF_SHARE_COMPAT)) != (HANDLE)HFILE_ERROR) { - free(fname); - return(exec_handle); - } - - /* should .com come before this case? */ - if ((exec_handle = (HANDLE)OpenFile(exec_path, file_info, - OF_READ | OF_SHARE_COMPAT)) != (HANDLE)HFILE_ERROR) { - free(fname); - return(exec_handle); - } - - strcpy(ext, ".com"); - if ((exec_handle = (HANDLE)OpenFile(fname, file_info, - OF_READ | OF_SHARE_COMPAT)) != (HANDLE)HFILE_ERROR) { - free(fname); - return(exec_handle); - } - - free(fname); - return(exec_handle); -} - - -/* - * Description: Create the child process to be helped - * - * Returns: - * - * 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 buf[256]; - DWORD bytes_returned; - DWORD flags; - char *command_line; - STARTUPINFO startInfo; - PROCESS_INFORMATION procInfo; - char *envblk=NULL; - OFSTRUCT file_info; - - - /* - * 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) - * We use OpenFile here because it is capable of searching the Path. - */ - - exec_handle = find_file(exec_path, &file_info); - - /* - * If we couldn't open the file, just assume that Windows32 will be able - * to find and execute it. - */ - if (exec_handle == (HANDLE)HFILE_ERROR) { - 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 - command_line = make_command_line( shell_name, file_info.szPathName, - argv); - - if ( command_line == NULL ) { - pproc->last_err = 0; - pproc->lerrno = E_NO_MEM; - return(-1); - } - - if (envp) { - if (arr2envblk(envp, &envblk) ==FALSE) { - pproc->last_err = 0; - pproc->lerrno = E_NO_MEM; - free( command_line ); - return(-1); - } - } - - if ((shell_name) || (file_not_found)) { - exec_path = 0; /* Search for the program in %Path% */ - } else { - exec_path = file_info.szPathName; - } - - /* - * Set up inherited stdin, stdout, stderr for child - */ - GetStartupInfo(&startInfo); - startInfo.dwFlags = STARTF_USESTDHANDLES; - startInfo.lpReserved = 0; - startInfo.cbReserved2 = 0; - startInfo.lpReserved2 = 0; - startInfo.lpTitle = shell_name ? shell_name : exec_path; - startInfo.hStdInput = (HANDLE)pproc->sv_stdin[1]; - startInfo.hStdOutput = (HANDLE)pproc->sv_stdout[1]; - startInfo.hStdError = (HANDLE)pproc->sv_stderr[1]; - - if (as_user) { - if (envblk) 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, command_line); - if (envblk) free(envblk); - free( command_line ); - return(-1); - } - } - - pproc->pid = (int)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 (pproc->sv_stdin) { - CloseHandle((HANDLE)pproc->sv_stdin[1]); - (HANDLE)pproc->sv_stdin[1] = 0; - } - if (pproc->sv_stdout) { - CloseHandle((HANDLE)pproc->sv_stdout[1]); - (HANDLE)pproc->sv_stdout[1] = 0; - } - if (pproc->sv_stderr) { - CloseHandle((HANDLE)pproc->sv_stderr[1]); - (HANDLE)pproc->sv_stderr[1] = 0; - } - - free( command_line ); - if (envblk) free(envblk); - pproc->lerrno=0; - return 0; -} - - - -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, tStdout, tStderr; - DWORD dwStdin, dwStdout, dwStderr; - HANDLE wait_list[4]; - DWORD wait_count; - DWORD wait_return; - HANDLE ready_hand; - bool_t child_dead = FALSE; - - - /* - * 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]); - (HANDLE)pproc->sv_stdin[0] = 0; - } else { - tStdin = (HANDLE) _beginthreadex( 0, 1024, - (unsigned (__stdcall *) (void *))proc_stdin_thread, pproc, 0, - (unsigned int *) &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, - (unsigned int *) &dwStdout); - tStderr = (HANDLE) _beginthreadex( 0, 1024, - (unsigned (__stdcall *) (void *))proc_stderr_thread, pproc, 0, - (unsigned int *) &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]); - (HANDLE)pproc->sv_stdin[0] = 0; - CloseHandle(tStdin); - tStdin = 0; - stdin_eof = TRUE; - - } else if (ready_hand == tStdout) { - - CloseHandle((HANDLE)pproc->sv_stdout[0]); - (HANDLE)pproc->sv_stdout[0] = 0; - CloseHandle(tStdout); - tStdout = 0; - stdout_eof = TRUE; - - } else if (ready_hand == tStderr) { - - CloseHandle((HANDLE)pproc->sv_stderr[0]); - (HANDLE)pproc->sv_stderr[0] = 0; - CloseHandle(tStderr); - tStderr = 0; - stderr_eof = TRUE; - - } else if (ready_hand == childhand) { - - if (GetExitCodeProcess(childhand, &pproc->exit_code) == 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); - -} - -/* - * 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; - - if (proc == NULL) - pproc = process_wait_for_any_private(); - 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; - } - - if (GetExitCodeProcess(childhand, &pproc->exit_code) == 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, ouput, 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]) - CloseHandle((HANDLE)pproc->sv_stdin[i]); - if ((HANDLE)pproc->sv_stdout[i]) - CloseHandle((HANDLE)pproc->sv_stdout[i]); - if ((HANDLE)pproc->sv_stderr[i]) - 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. - */ - if (*argv) 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) { - if (enclose_in_quotes) 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'; - - if (enclose_in_quotes) 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) -{ - HANDLE hIn; - HANDLE hOut; - HANDLE hErr; - HANDLE hProcess; - - if (DuplicateHandle(GetCurrentProcess(), - GetStdHandle(STD_INPUT_HANDLE), - GetCurrentProcess(), - &hIn, - 0, - TRUE, - DUPLICATE_SAME_ACCESS) == FALSE) { - fprintf(stderr, - "process_easy: DuplicateHandle(In) failed (e=%d)\n", - GetLastError()); - return INVALID_HANDLE_VALUE; - } - if (DuplicateHandle(GetCurrentProcess(), - GetStdHandle(STD_OUTPUT_HANDLE), - GetCurrentProcess(), - &hOut, - 0, - TRUE, - DUPLICATE_SAME_ACCESS) == FALSE) { - fprintf(stderr, - "process_easy: DuplicateHandle(Out) failed (e=%d)\n", - GetLastError()); - return INVALID_HANDLE_VALUE; - } - if (DuplicateHandle(GetCurrentProcess(), - GetStdHandle(STD_ERROR_HANDLE), - GetCurrentProcess(), - &hErr, - 0, - TRUE, - DUPLICATE_SAME_ACCESS) == FALSE) { - fprintf(stderr, - "process_easy: DuplicateHandle(Err) failed (e=%d)\n", - GetLastError()); - return INVALID_HANDLE_VALUE; - } - - hProcess = process_init_fd(hIn, hOut, hErr); - - if (process_begin(hProcess, argv, envp, argv[0], NULL)) { - fake_exits_pending++; - ((sub_process*) hProcess)->exit_code = process_last_err(hProcess); - - /* close up unused handles */ - CloseHandle(hIn); - CloseHandle(hOut); - CloseHandle(hErr); - } - - process_register(hProcess); - - return hProcess; -} diff --git a/src/gmake/w32/subproc/w32err.c b/src/gmake/w32/subproc/w32err.c deleted file mode 100644 index 6afb81be..00000000 --- a/src/gmake/w32/subproc/w32err.c +++ /dev/null @@ -1,51 +0,0 @@ -#include -#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 - */ -char * -map_windows32_error_to_string (DWORD ercode) { -/* __declspec (thread) necessary if you will use multiple threads */ -__declspec (thread) static char szMessageBuffer[128]; - - /* Fill message buffer with a default message in - * case FormatMessage fails - */ - wsprintf (szMessageBuffer, "Error %ld", ercode); - - /* - * Special code for winsock error handling. - */ - if (ercode > WSABASEERR) { - HMODULE hModule = GetModuleHandle("wsock32"); - if (hModule != NULL) { - FormatMessage(FORMAT_MESSAGE_FROM_HMODULE, - hModule, - ercode, - LANG_NEUTRAL, - szMessageBuffer, - sizeof(szMessageBuffer), - NULL); - FreeLibrary(hModule); - } - } else { - /* - * Default system message handling - */ - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, - NULL, - ercode, - LANG_NEUTRAL, - szMessageBuffer, - sizeof(szMessageBuffer), - NULL); - } - return szMessageBuffer; -} - -- 2.11.4.GIT