1--- make-dfsg-4.1.orig/ar.c
2+++ make-dfsg-4.1/ar.c
3@@ -68,25 +68,39 @@
4
5 /* This function is called by 'ar_scan' to find which member to look at.  */
6
7+struct member_date_lookup
8+{
9+  const char *name;
10+  time_t *member_date;
11+};
12+
13 /* ARGSUSED */
14 static long int
15 ar_member_date_1 (int desc UNUSED, const char *mem, int truncated,
16                   long int hdrpos UNUSED, long int datapos UNUSED,
17                   long int size UNUSED, long int date,
18                   int uid UNUSED, int gid UNUSED, int mode UNUSED,
19-                  const void *name)
20+                  const void *data)
21 {
22-  return ar_name_equal (name, mem, truncated) ? date : 0;
23+  const struct member_date_lookup *lookup_data = data;
24+  if (ar_name_equal (lookup_data->name, mem, truncated))
25+    {
26+      *lookup_data->member_date = date;
27+      return 1;
28+    }
29+  return 0;
30 }
31
32-/* Return the modtime of NAME.  */
33+/* Read the modtime of NAME in MEMBER_DATE.
34+   Returns 1 if NAME exists, 0 otherwise.  */
35
36-time_t
37-ar_member_date (const char *name)
38+int
39+ar_member_date (const char *name, time_t *member_date)
40 {
41   char *arname;
42   char *memname;
43-  long int val;
44+  int found;
45+  struct member_date_lookup lookup_data;
46
47   ar_parse_name (name, &arname, &memname);
48
49@@ -107,11 +121,14 @@
50       (void) f_mtime (arfile, 0);
51   }
52
53-  val = ar_scan (arname, ar_member_date_1, memname);
54+  lookup_data.name = memname;
55+  lookup_data.member_date = member_date;
56+  found = ar_scan (arname, ar_member_date_1, &lookup_data);
57
58   free (arname);
59
60-  return (val <= 0 ? (time_t) -1 : (time_t) val);
61+  /* return 0 (not found) if the archive does not exist or has invalid format. */
62+  return (found == 1) ? 1 : 0;
63 }
64
65 /* Set the archive-member NAME's modtime to now.  */
66--- make-dfsg-4.1.orig/commands.c
67+++ make-dfsg-4.1/commands.c
68@@ -622,7 +622,10 @@
69       time_t file_date = (file->last_mtime == NONEXISTENT_MTIME
70                           ? (time_t) -1
71                           : (time_t) FILE_TIMESTAMP_S (file->last_mtime));
72-      if (ar_member_date (file->name) != file_date)
73+      time_t member_date = NONEXISTENT_MTIME;
74+      int found;
75+      found = ar_member_date (file->name, &member_date);
76+      if (found && member_date != file_date)
77         {
78           if (on_behalf_of)
79             OSS (error, NILF,
80--- make-dfsg-4.1.orig/configure
81+++ make-dfsg-4.1/configure
82@@ -11060,10 +11061,9 @@
83 #include <glob.h>
84 #include <fnmatch.h>
85
86-#define GLOB_INTERFACE_VERSION 1
87 #if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1
88 # include <gnu-versions.h>
89-# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
90+# if _GNU_GLOB_INTERFACE_VERSION == 1 || _GNU_GLOB_INTERFACE_VERSION == 2
91    gnu glob
92 # endif
93 #endif],
94--- make-dfsg-4.1.orig/dir.c
95+++ make-dfsg-4.1/dir.c
96@@ -748,8 +748,11 @@
97   const char *slash;
98
99 #ifndef NO_ARCHIVES
100-  if (ar_name (name))
101-    return ar_member_date (name) != (time_t) -1;
102+  {
103+    time_t member_date;
104+    if (ar_name (name))
105+      return ar_member_date (name, &member_date);
106+  }
107 #endif
108
109 #ifdef VMS
110@@ -1212,15 +1215,40 @@
111 }
112 #endif
113
114+/* Similarly for lstat.  */
115+#if !defined(lstat) && !defined(WINDOWS32) || defined(VMS)
116+# ifndef VMS
117+#  ifndef HAVE_SYS_STAT_H
118+int lstat (const char *path, struct stat *sbuf);
119+#  endif
120+# else
121+    /* We are done with the fake lstat.  Go back to the real lstat */
122+#   ifdef lstat
123+#     undef lstat
124+#   endif
125+# endif
126+# define local_lstat lstat
127+#elif defined(WINDOWS32)
128+/* Windows doesn't support lstat().  */
129+# define local_lstat local_stat
130+#else
131+static int
132+local_lstat (const char *path, struct stat *buf)
133+{
134+  int e;
135+  EINTRLOOP (e, lstat (path, buf));
136+  return e;
137+}
138+#endif
139+
140 void
141 dir_setup_glob (glob_t *gl)
142 {
143   gl->gl_opendir = open_dirstream;
144   gl->gl_readdir = read_dirstream;
145   gl->gl_closedir = free;
146+  gl->gl_lstat = local_lstat;
147   gl->gl_stat = local_stat;
148-  /* We don't bother setting gl_lstat, since glob never calls it.
149-     The slot is only there for compatibility with 4.4 BSD.  */
150 }
151
152 void
153--- make-dfsg-4.1.orig/job.c
154+++ make-dfsg-4.1/job.c
155@@ -27,6 +27,14 @@
156
157 #include <string.h>
158
159+#if defined (HAVE_LINUX_BINFMTS_H) && defined (HAVE_SYS_USER_H)
160+#include <sys/user.h>
161+#include <linux/binfmts.h>
162+#endif
163+#ifndef PAGE_SIZE
164+# define PAGE_SIZE (sysconf(_SC_PAGESIZE))
165+#endif
166+
167 /* Default shell to use.  */
168 #ifdef WINDOWS32
169 #include <windows.h>
170@@ -824,8 +832,6 @@
171           break;
172         }
173
174-      child_failed = exit_sig != 0 || exit_code != 0;
175-
176       /* Search for a child matching the deceased one.  */
177       lastc = 0;
178       for (c = children; c != 0; lastc = c, c = c->next)
179@@ -837,6 +843,15 @@
180            Ignore it; it was inherited from our invoker.  */
181         continue;
182
183+      /* Determine the failure status: 0 for success, 1 for updating target in
184+         question mode, 2 for anything else.  */
185+      if (exit_sig == 0 && exit_code == 0)
186+        child_failed = MAKE_SUCCESS;
187+      else if (exit_sig == 0 && exit_code == 1 && question_flag && c->recursive)
188+        child_failed = MAKE_TROUBLE;
189+      else
190+        child_failed = MAKE_FAILURE;
191+
192       DB (DB_JOBS, (child_failed
193                     ? _("Reaping losing child %p PID %s %s\n")
194                     : _("Reaping winning child %p PID %s %s\n"),
195@@ -872,10 +887,10 @@
196              delete non-precious targets, and abort.  */
197           static int delete_on_error = -1;
198
199-          if (!dontcare)
200+          if (!dontcare && child_failed == MAKE_FAILURE)
201             child_error (c, exit_code, exit_sig, coredump, 0);
202
203-          c->file->update_status = us_failed;
204+          c->file->update_status = child_failed == MAKE_FAILURE ? us_failed : us_question;
205           if (delete_on_error == -1)
206             {
207               struct file *f = lookup_file (".DELETE_ON_ERROR");
208@@ -987,7 +1002,7 @@
209       if (!err && child_failed && !dontcare && !keep_going_flag &&
210           /* fatal_error_signal will die with the right signal.  */
211           !handling_fatal_signal)
212-        die (MAKE_FAILURE);
213+        die (child_failed);
214
215       /* Only block for one child.  */
216       block = 0;
217@@ -1189,14 +1204,15 @@
218       ++p;
219     }
220
221+  child->recursive = ((flags & COMMANDS_RECURSE) != 0);
222+
223   /* Update the file's command flags with any new ones we found.  We only
224      keep the COMMANDS_RECURSE setting.  Even this isn't 100% correct; we are
225      now marking more commands recursive than should be in the case of
226      multiline define/endef scripts where only one line is marked "+".  In
227      order to really fix this, we'll have to keep a lines_flags for every
228      actual line, after expansion.  */
229-  child->file->cmds->lines_flags[child->command_line - 1]
230-    |= flags & COMMANDS_RECURSE;
231+  child->file->cmds->lines_flags[child->command_line - 1] |= flags & COMMANDS_RECURSE;
232
233   /* POSIX requires that a recipe prefix after a backslash-newline should
234      be ignored.  Remove it now so the output is correct.  */
235@@ -3115,6 +3131,7 @@
236 #ifdef WINDOWS32
237     char *command_ptr = NULL; /* used for batch_mode_shell mode */
238 #endif
239+    char *args_ptr;
240
241 # ifdef __EMX__ /* is this necessary? */
242     if (!unixy_shell && shellflags)
243@@ -3280,8 +3297,17 @@
244         return new_argv;
245       }
246
247+#ifdef MAX_ARG_STRLEN
248+    static char eval_line[] = "eval\\ \\\"set\\ x\\;\\ shift\\;\\ ";
249+#define ARG_NUMBER_DIGITS 5
250+#define EVAL_LEN (sizeof(eval_line)-1 + shell_len + 4                   \
251+                  + (7 + ARG_NUMBER_DIGITS) * 2 * line_len / (MAX_ARG_STRLEN - 2))
252+#else
253+#define EVAL_LEN 0
254+#endif
255+
256     new_line = xmalloc ((shell_len*2) + 1 + sflags_len + 1
257-                        + (line_len*2) + 1);
258+                        + (line_len*2) + 1 + EVAL_LEN);
259     ap = new_line;
260     /* Copy SHELL, escaping any characters special to the shell.  If
261        we don't escape them, construct_command_argv_internal will
262@@ -3301,6 +3327,30 @@
263 #ifdef WINDOWS32
264     command_ptr = ap;
265 #endif
266+
267+#if !defined (WINDOWS32) && defined (MAX_ARG_STRLEN)
268+    if (unixy_shell && line_len > MAX_ARG_STRLEN)
269+      {
270+       unsigned j;
271+       memcpy (ap, eval_line, sizeof (eval_line) - 1);
272+       ap += sizeof (eval_line) - 1;
273+       for (j = 1; j <= 2 * line_len / (MAX_ARG_STRLEN - 2); j++)
274+         ap += sprintf (ap, "\\$\\{%u\\}", j);
275+       *ap++ = '\\';
276+       *ap++ = '"';
277+       *ap++ = ' ';
278+       /* Copy only the first word of SHELL to $0.  */
279+       for (p = shell; *p != '\0'; ++p)
280+         {
281+           if (isspace ((unsigned char)*p))
282+             break;
283+           *ap++ = *p;
284+         }
285+       *ap++ = ' ';
286+      }
287+#endif
288+    args_ptr = ap;
289+
290     for (p = line; *p != '\0'; ++p)
291       {
292         if (restp != NULL && *p == '\n')
293@@ -3348,6 +3398,13 @@
294           }
295 #endif
296         *ap++ = *p;
297+#if !defined (WINDOWS32) && defined (MAX_ARG_STRLEN)
298+       if (unixy_shell && line_len > MAX_ARG_STRLEN && (ap - args_ptr > MAX_ARG_STRLEN - 2))
299+         {
300+           *ap++ = ' ';
301+           args_ptr = ap;
302+         }
303+#endif
304       }
305     if (ap == new_line + shell_len + sflags_len + 2)
306       {
307--- make-dfsg-4.1.orig/job.h
308+++ make-dfsg-4.1/job.h
309@@ -108,6 +108,7 @@
310     unsigned int  noerror:1;    /* Nonzero if commands contained a '-'.  */
311     unsigned int  good_stdin:1; /* Nonzero if this child has a good stdin.  */
312     unsigned int  deleted:1;    /* Nonzero if targets have been deleted.  */
313+    unsigned int  recursive:1;  /* Nonzero for recursive command ('+' etc.)  */
314     unsigned int  dontcare:1;   /* Saved dontcare flag.  */
315   };
316
317--- make-dfsg-4.1.orig/main.c
318+++ make-dfsg-4.1/main.c
319@@ -1401,13 +1401,18 @@
320 #ifdef HAVE_ISATTY
321     if (isatty (fileno (stdout)))
322       if (! lookup_variable (STRING_SIZE_TUPLE ("MAKE_TERMOUT")))
323-        define_variable_cname ("MAKE_TERMOUT", TTYNAME (fileno (stdout)),
324-                               o_default, 0)->export = v_export;
325-
326+        {
327+          const char *tty = TTYNAME (fileno (stdout));
328+          define_variable_cname ("MAKE_TERMOUT", tty ? tty : DEFAULT_TTYNAME,
329+                                 o_default, 0)->export = v_export;
330+        }
331     if (isatty (fileno (stderr)))
332       if (! lookup_variable (STRING_SIZE_TUPLE ("MAKE_TERMERR")))
333-        define_variable_cname ("MAKE_TERMERR", TTYNAME (fileno (stderr)),
334-                               o_default, 0)->export = v_export;
335+        {
336+          const char *tty = TTYNAME (fileno (stderr));
337+          define_variable_cname ("MAKE_TERMERR", tty ? tty : DEFAULT_TTYNAME,
338+                                 o_default, 0)->export = v_export;
339+        }
340 #endif
341
342   /* Reset in case the switches changed our minds.  */
343@@ -2418,6 +2423,11 @@
344             exit (WIFEXITED(r) ? WEXITSTATUS(r) : EXIT_FAILURE);
345           }
346 #else
347+#ifdef SET_STACK_SIZE
348+          /* Reset limits, if necessary.  */
349+          if (stack_limit.rlim_cur)
350+            setrlimit (RLIMIT_STACK, &stack_limit);
351+#endif
352           exec_command ((char **)nargv, environ);
353 #endif
354           free (aargv);
355--- make-dfsg-4.1.orig/makeint.h
356+++ make-dfsg-4.1/makeint.h
357@@ -424,10 +424,11 @@
358 /* The number of bytes needed to represent the largest integer as a string.  */
359 #define INTSTR_LENGTH         CSTRLEN ("18446744073709551616")
360
361+#define DEFAULT_TTYNAME "true"
362 #ifdef HAVE_TTYNAME
363 # define TTYNAME(_f) ttyname (_f)
364 #else
365-# define TTYNAME(_f) "true"
366+# define TTYNAME(_f) DEFAULT_TTYNAME
367 #endif
368
369
370@@ -478,7 +479,7 @@
371 int ar_name (const char *);
372 void ar_parse_name (const char *, char **, char **);
373 int ar_touch (const char *);
374-time_t ar_member_date (const char *);
375+int ar_member_date (const char *, time_t *);
376
377 typedef long int (*ar_member_func_t) (int desc, const char *mem, int truncated,
378                                       long int hdrpos, long int datapos,
379--- make-dfsg-4.1.orig/remake.c
380+++ make-dfsg-4.1/remake.c
381@@ -1259,6 +1259,7 @@
382
383       char *arname, *memname;
384       struct file *arfile;
385+      int found;
386       time_t member_date;
387
388       /* Find the archive's name.  */
389@@ -1306,10 +1307,15 @@
390         /* The archive doesn't exist, so its members don't exist either.  */
391         return NONEXISTENT_MTIME;
392
393-      member_date = ar_member_date (file->hname);
394-      mtime = (member_date == (time_t) -1
395-               ? NONEXISTENT_MTIME
396-               : file_timestamp_cons (file->hname, member_date, 0));
397+      found = ar_member_date (file->hname, &member_date);
398+      if (found && member_date == (time_t) 0)
399+        {
400+              OSS (error, NILF,
401+                   _("Warning: Archive '%s' seems to have been created in deterministic mode. '%s' will always be updated. Please consider passing the U flag to ar to avoid the problem."),
402+                   arfile->name, memname);
403+
404+        }
405+      mtime = found ? file_timestamp_cons (file->hname, member_date, 0) : NONEXISTENT_MTIME;
406     }
407   else
408 #endif
409@@ -1548,9 +1554,11 @@
410 {
411   static const char *dirs[] =
412     {
413+#ifdef MULTIARCH_DIRS
414+      MULTIARCH_DIRS
415+#endif
416 #ifndef _AMIGA
417       "/lib",
418-      "/usr/lib",
419 #endif
420 #if defined(WINDOWS32) && !defined(LIBDIR)
421 /*
422@@ -1559,7 +1567,19 @@
423  */
424 #define LIBDIR "."
425 #endif
426-      LIBDIR,                   /* Defined by configuration.  */
427+      LIBDIR,			/* Defined by configuration.  */
428+#ifndef _AMIGA
429+/*
430+ * In the Debian binaries, PREFIX is /usr and thus this searches /lib,
431+ * /usr/lib and /usr/lib again and therefore misses any libraries that
432+ * are not packaged and were installed by the site admin.  The ideal
433+ * behaviour would be to have the search path set by a Makefile
434+ * variable (other than the VPATH blunt object) but even absent that,
435+ * it would be more useful if it looked in /usr/local/lib even though
436+ * make itself hasn't been installed in the /usr/local tree -- manoj
437+ */
438+      "/usr/local/lib",
439+#endif
440       0
441     };
442
443