* Various bug fixes.
authorPaul Smith <psmith@gnu.org>
Sat, 22 Apr 2000 02:11:17 +0000 (02:11 +0000)
committerPaul Smith <psmith@gnu.org>
Sat, 22 Apr 2000 02:11:17 +0000 (02:11 +0000)
13 files changed:
ChangeLog
README.DOS.template
arscan.c
config.h.W32.template
function.c
main.c
make.texinfo
remake.c
tests/ChangeLog
tests/scripts/features/double_colon
tests/scripts/features/reinvoke
tests/scripts/functions/strip
w32/subproc/sub_proc.c

index 657b170..8014686 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,45 @@
+2000-04-18  Paul D. Smith  <psmith@gnu.org>
+
+       * 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 <Gilles.Bourhis@univ-rennes1.fr>.
+
+2000-04-17  Paul D. Smith  <psmith@gnu.org>
+
+       * 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 <jwksmith@attglobal.net>
+
+2000-04-17  Bruno Haible  <haible@clisp.cons.org>
+
+       * arscan.c [BeOS]: Add replacement for nonexistent <ar.h> from GNU
+       binutils.
+
+2000-04-11  Paul D. Smith  <psmith@gnu.org>
+
+       * 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  <eliz@is.elta.co.il>
+
+       * README.DOS: Add instructions to install a binary distro.
+       Mention latest versions of Windows.
+
+2000-04-07  Eli Zaretskii  <eliz@is.elta.co.il>
+
+       * 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  <psmith@gnu.org>
 
        * Version 3.79 released.
index 4d78677..5218bb4 100644 (file)
@@ -34,11 +34,22 @@ New (since 3.74) DOS-specific features:
       environment (requires Perl and auxiliary tools; see below).
 
 
-To build:
+To install a binary distribution:
+
+   Simply unzip the makNNNb.zip file (where NNN is the version number)
+   preserving the directory structure (-d switch if you use PKUNZIP).
+   If you are installing Make on Windows 9X or Windows 2000, use an
+   unzip program that supports long filenames in zip files.  After
+   unzipping, make sure the directory with make.exe is on your PATH,
+   and that's all you need to use Make.
+
+
+To build from sources:
 
    1. Unzip the archive, preserving the directory structure (-d switch
-      if you use PKUNZIP).  If you build Make on Windows 95, use an
-      unzip program that supports long filenames in zip files.
+      if you use PKUNZIP).  If you build Make on Windows 9X or Windows
+      2000, use an unzip program that supports long filenames in zip
+      files.
 
       If you are unpacking an official GNU source distribution, use
       either DJTAR (which is part of the DJGPP development
index 2b90705..5cadbe6 100644 (file)
--- a/arscan.c
+++ b/arscan.c
@@ -232,7 +232,25 @@ ar_scan (archive, function, arg)
 #endif
 
 #ifndef WINDOWS32
-# include <ar.h>
+# ifndef __BEOS__
+#  include <ar.h>
+# else
+   /* BeOS 5 doesn't have <ar.h> but has archives in the same format
+    * as many other Unices.  This was taken from GNU binutils for BeOS.
+    */
+#  define ARMAG        "!<arch>\n"     /* String that begins an archive file.  */
+#  define SARMAG 8             /* Size of that string.  */
+#  define ARFMAG "`\n"         /* String in ar_fmag at end of each header.  */
+struct ar_hdr
+  {
+    char ar_name[16];          /* Member file name, sometimes / terminated. */
+    char ar_date[12];          /* File date, decimal seconds since Epoch.  */
+    char ar_uid[6], ar_gid[6]; /* User and group IDs, in ASCII decimal.  */
+    char ar_mode[8];           /* File mode, in ASCII octal.  */
+    char ar_size[10];          /* File size, in ASCII decimal.  */
+    char ar_fmag[2];           /* Always contains ARFMAG.  */
+  };
+# endif
 #else
 /* These should allow us to read Windows (VC++) libraries (according to Frank
  * Libbrecht <frankl@abzx.belgium.hp.com>)
index 9c1da1a..53c0e07 100644 (file)
 #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<file>' option.  */
 /* #undef SCCS_GET_MINUS_G */
 
index dd638ae..9c46226 100644 (file)
@@ -1642,33 +1642,33 @@ static struct function_table_entry function_table[] =
  /* 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"),      1,  1,  1,  func_basename_dir},
-  { STRING_SIZE_TUPLE("dir"),           1,  1,  1,  func_basename_dir},
-  { STRING_SIZE_TUPLE("notdir"),        1,  1,  1,  func_notdir_suffix},
+  { 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"),        1,  1,  1,  func_notdir_suffix},
+  { 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"),     1,  1,  1,  func_firstword},
+  { 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"),         1,  1,  1,  func_shell},
-  { STRING_SIZE_TUPLE("sort"),          1,  1,  1,  func_sort},
-  { STRING_SIZE_TUPLE("strip"),         1,  1,  1,  func_strip},
-  { STRING_SIZE_TUPLE("wildcard"),      1,  1,  1,  func_wildcard},
+  { 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"),         1,  1,  1,  func_words},
-  { STRING_SIZE_TUPLE("origin"),        1,  1,  1,  func_origin},
+  { 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"),         1,  1,  1,  func_error},
-  { STRING_SIZE_TUPLE("warning"),       1,  1,  1,  func_error},
+  { 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},
 #ifdef EXPERIMENTAL
   { STRING_SIZE_TUPLE("eq"),            2,  2,  1,  func_eq},
-  { STRING_SIZE_TUPLE("not"),           1,  1,  1,  func_not},
+  { STRING_SIZE_TUPLE("not"),           0,  1,  1,  func_not},
 #endif
   { 0 }
 };
@@ -1688,6 +1688,13 @@ expand_builtin_function (o, argc, argv, entry_p)
            _("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);
diff --git a/main.c b/main.c
index e9cdae5..35a388b 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1255,17 +1255,47 @@ int main (int argc, char ** argv)
               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 TMP_TEMPLATE   "sys$scratch:GmXXXXXX"
+# define DEFAULT_TMPDIR     "sys$scratch:"
 #else
-# define TMP_TEMPLATE   "/tmp/GmXXXXXX"
+# 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)
+                /* 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);
+
+#if defined __MSDOS__ || defined(WINDOWS32)
+           if (strchr ("/\\", template[strlen (template) - 1]) == NULL)
+             strcat (template, "/");
+#else
+#ifndef VMS
+           if (template[strlen (template) - 1] != '/')
+             strcat (template, "/");
+#endif /* !VMS */
+#endif /* __MSDOS__ || WINDOWS32 */
 
-           outfile = open_tmpfile (&stdin_nm, TMP_TEMPLATE);
+           strcat (template, DEFAULT_TMPFILE);
+           outfile = open_tmpfile (&stdin_nm, template);
            if (outfile == 0)
              pfatal_with_name (_("fopen (temporary file)"));
            while (!feof (stdin))
@@ -2658,7 +2688,7 @@ print_version ()
 
   printf (_(", by Richard Stallman and Roland McGrath.\n\
 %sBuilt for %s\n\
-%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99\n\
+%sCopyright (C) 1988, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000\n\
 %s\tFree Software Foundation, Inc.\n\
 %sThis is free software; see the source for copying conditions.\n\
 %sThere is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\
index 6b16027..7bbd1d2 100644 (file)
@@ -6828,27 +6828,27 @@ first character is considered, and values must be comma- or
 space-separated.
 
 @table @code
-@item a@var{ll}
+@item a (@i{all})
 All types of debugging output is enabled.  This is equivalent to using
 @samp{-d}.
 
-@item b@var{asic}
+@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@var{erbose}
+@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@var{mplicit}
+@item i (@i{implicit})
 Prints messages describing the implicit rule searches for each target.
 This option also enables @samp{basic} messages.
 
-@item j@var{obs}
+@item j (@i{jobs})
 Prints messages giving details on the invocation of specific subcommands.
 
-@item m@var{akefile}
+@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
@@ -6956,6 +6956,8 @@ Some Files}.@refill
 @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
index ad0d3e5..0d01664 100644 (file)
--- a/remake.c
+++ b/remake.c
@@ -1038,6 +1038,7 @@ f_mtime (file, search)
 
       char *arname, *memname;
       struct file *arfile;
+      time_t memtime;
       int arname_used = 0;
 
       /* Find the archive's name.  */
@@ -1097,7 +1098,12 @@ f_mtime (file, search)
        /* The archive doesn't exist, so it's members don't exist either.  */
        return (FILE_TIMESTAMP) -1;
 
-      mtime = FILE_TIMESTAMP_FROM_S_AND_NS (ar_member_date (file->hname), 0);
+      memtime = ar_member_date (file->hname);
+      if (memtime == (time_t) -1)
+       /* The archive member doesn't exist.  */
+        return (FILE_TIMESTAMP) -1;
+
+      mtime = FILE_TIMESTAMP_FROM_S_AND_NS (memtime, 0);
     }
   else
 #endif
index aca7225..5e3d72a 100644 (file)
@@ -1,3 +1,18 @@
+2000-04-11  Paul D. Smith  <psmith@gnu.org>
+
+       * scripts/functions/strip: Test empty value to strip (PR/1689).
+
+2000-04-08  Eli Zaretskii  <eliz@is.elta.co.il>
+
+       * scripts/features/reinvoke: Sleep before updating the target
+       files in the first test, to ensure its time stamp really gets
+       newer; otherwise Make might re-exec more than once.
+
+2000-04-07  Eli Zaretskii  <eliz@is.elta.co.il>
+
+       * scripts/features/double_colon: Don't run the parallel tests if
+       parallel jobs aren't supported.
+
 2000-04-04  Paul D. Smith  <psmith@gnu.org>
 
        * scripts/functions/word: wordlist doesn't swap arguments anymore.
index e0e53f0..3e140c7 100644 (file)
@@ -51,9 +51,11 @@ $answer = "aaa\nbbb\n";
 
 # TEST 1: As above, in parallel
 
-&run_make_with_options($makefile, "-j10 all", &get_logfile, 0);
-$answer = "aaa\nbbb\n";
-&compare_output($answer, &get_logfile(1));
+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
 
@@ -63,9 +65,11 @@ $answer = "aaa\naaa done\nbbb\n";
 
 # TEST 3: As above, in parallel
 
-&run_make_with_options($makefile, "-j10 bar", &get_logfile, 0);
-$answer = "aaa\naaa done\nbbb\n";
-&compare_output($answer, &get_logfile(1));
+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
 
@@ -78,9 +82,11 @@ $answer = "f1.h\nfoo FIRST\n";
 
 # TEST 5: Again, in parallel.
 
-&run_make_with_options($makefile, "-j10 foo", &get_logfile, 0);
-$answer = "f1.h\nfoo FIRST\n";
-&compare_output($answer, &get_logfile(1));
+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
 
@@ -94,9 +100,11 @@ $answer = "f2.h\nfoo SECOND\n";
 
 # TEST 7: Again, in parallel.
 
-&run_make_with_options($makefile, "-j10 foo", &get_logfile, 0);
-$answer = "f2.h\nfoo SECOND\n";
-&compare_output($answer, &get_logfile(1));
+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
 
@@ -108,9 +116,11 @@ $answer = "ok\n$make_name: Circular d <- d dependency dropped.\noops\n";
 #
 # Hmm... further testing indicates this might be timing-dependent?
 #
-#&run_make_with_options($makefile, "-j10 biz", &get_logfile, 0);
-#$answer = "aaa\ntwo\nbbb\n";
-#&compare_output($answer, &get_logfile(1));
+#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');
 
index dacfd33..3e9ae66 100644 (file)
@@ -18,6 +18,7 @@ all: ; \@echo 'running rules.'
 
 $makefile $makefile2: $makefile_orig
        \@echo 'rebuilding \$\@.'
+       \@sleep $wtime
        \@echo >> \$\@
 
 include $makefile2
@@ -30,7 +31,7 @@ close(MAKEFILE);
 
 # Sleep 2 seconds for DOS/Windows FAT volumes which have 2-second
 # granularity of file times.
-sleep(2);
+sleep($wtime);
 
 &touch("$makefile_orig");
 
@@ -67,7 +68,7 @@ close(MAKEFILE);
 
 &touch('b');
 &touch('a');
-sleep(2);
+sleep($wtime);
 &touch('c');
 
 # First try with the file that's not updated "once removed" from the
index 1f487c0..8222433 100644 (file)
@@ -34,6 +34,8 @@ all:
        @echo '$(strip  $(TEST2) )'
        @echo '$(strip  $(TEST3) )'
 
+space: ; @echo '$(strip ) $(strip         )'
+
 EOMAKE
 
 # END of Contents of MAKEFILE
@@ -41,13 +43,15 @@ EOMAKE
 close(MAKEFILE);
 
 &run_make_with_options($makefile,"",&get_logfile);
-
-# Create the answer to what should be produced by this Makefile
 $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;
index 1cf3bea..52f2fa2 100644 (file)
@@ -7,11 +7,10 @@
 #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);
 
-extern int debug_flag; /* from make */
-
 typedef struct sub_process_t {
        int sv_stdin[2];
        int sv_stdout[2];
@@ -506,10 +505,9 @@ process_begin(
                if (envblk) free(envblk);
                return -1;
        } else {
-               if (debug_flag)
-                       printf("CreateProcess(%s,%s,...)\n",
-                               exec_path ? exec_path : "NULL",
-                               command_line ? command_line : "NULL");
+               DB (DB_JOBS, ("CreateProcess(%s,%s,...)\n",
+                       exec_path ? exec_path : "NULL",
+                       command_line ? command_line : "NULL"));
                if (CreateProcess(
                        exec_path,
                        command_line,