* windres.c: add verbose option
(main): process verbose option
* resrc.c (look_for_default): new.  Look for the default
preprocessor in a given location.
(read_rc_file): for foo/bar-windres, look for foo/bar-gcc,
foo/gcc (in case of foo/windres), and then gcc (the old default).
diff --git a/binutils/ChangeLog b/binutils/ChangeLog
index 8b39b60..1b1121c 100644
--- a/binutils/ChangeLog
+++ b/binutils/ChangeLog
@@ -1,3 +1,12 @@
+1999-05-17  DJ Delorie  <dj@cygnus.com>
+
+	* windres.c: add verbose option
+	(main): process verbose option
+	* resrc.c (look_for_default): new.  Look for the default
+	preprocessor in a given location.
+	(read_rc_file): for foo/bar-windres, look for foo/bar-gcc,
+	foo/gcc (in case of foo/windres), and then gcc (the old default).
+
 1999-05-16  Nick Clifton  <nickc@cygnus.com>
 
 	* dlltool.c (deduce_name): New function: Deduce name of program to
diff --git a/binutils/binutils.texi b/binutils/binutils.texi
index 5f7c646..b431a95 100644
--- a/binutils/binutils.texi
+++ b/binutils/binutils.texi
@@ -2048,10 +2048,15 @@
 option.  @code{windres} will also search this directory when looking for
 files named in the @code{rc} file.
 
+@item -D @var{target}
 @item --define @var{sym[=val]}
 Specify a @code{-D} option to pass to the preprocessor when reading an
 @code{rc} file.
 
+@item -v
+Enable verbose mode.  This tells you what the preprocessor is if you
+didn't specify one.
+
 @item --language @var{val}
 Specify the default language to use when reading an @code{rc} file.
 @var{val} should be a hexadecimal language code.  The low eight bits are
diff --git a/binutils/resrc.c b/binutils/resrc.c
index 9ba3c11..41c9cca 100644
--- a/binutils/resrc.c
+++ b/binutils/resrc.c
@@ -120,6 +120,52 @@
   PARAMS ((FILE *, unsigned char *, unsigned long, const char *));
 static void define_fontdirs PARAMS ((void));
 
+/* look for the preprocessor program */
+
+FILE *
+look_for_default (cmd, prefix, end_prefix, preprocargs, filename)
+     char *cmd;
+     char *prefix;
+     int end_prefix;
+     char *preprocargs;
+     char *filename;
+{
+  char *path = getenv ("PATH");
+  char *space;
+  int found;
+  struct stat s;
+
+  strcpy (cmd, prefix);
+
+  sprintf (cmd+end_prefix, "%s", DEFAULT_PREPROCESSOR);
+  space = strchr (cmd+end_prefix, ' ');
+  if (space)
+    *space = 0;
+
+  if (strchr (cmd, '/'))
+    {
+      found = stat (cmd, &s);
+
+      if (found < 0)
+	{
+	  if (verbose)
+	    fprintf (stderr, "Tried `%s'\n", cmd);
+	  return 0;
+	}
+    }
+
+  strcpy (cmd, prefix);
+
+  sprintf (cmd+end_prefix, "%s %s %s",
+	   DEFAULT_PREPROCESSOR, preprocargs, filename);
+
+  if (verbose)
+    fprintf (stderr, "Using `%s'\n", cmd);
+
+  cpp_pipe = popen (cmd, FOPEN_RT);
+  return cpp_pipe;
+}
+
 /* Read an rc file.  */
 
 struct res_directory *
@@ -131,21 +177,78 @@
 {
   char *cmd;
 
-  if (preprocessor == NULL)
-    preprocessor = DEFAULT_PREPROCESSOR;
-
   if (preprocargs == NULL)
     preprocargs = "";
   if (filename == NULL)
     filename = "-";
 
-  cmd = xmalloc (strlen (preprocessor)
-		 + strlen (preprocargs)
-		 + strlen (filename)
-		 + 10);
-  sprintf (cmd, "%s %s %s", preprocessor, preprocargs, filename);
+  if (preprocessor)
+    {
+      cmd = xmalloc (strlen (preprocessor)
+		     + strlen (preprocargs)
+		     + strlen (filename)
+		     + 10);
+      sprintf (cmd, "%s %s %s", preprocessor, preprocargs, filename);
 
-  cpp_pipe = popen (cmd, FOPEN_RT);
+      cpp_pipe = popen (cmd, FOPEN_RT);
+    }
+  else
+    {
+      char *dash, *slash, *cp;
+
+      preprocessor = DEFAULT_PREPROCESSOR;
+
+      cmd = xmalloc (strlen (program_name)
+		     + strlen (preprocessor)
+		     + strlen (preprocargs)
+		     + strlen (filename)
+		     + 10);
+
+
+      dash = slash = 0;
+      for (cp=program_name; *cp; cp++)
+	{
+	  if (*cp == '-')
+	    dash = cp;
+	  if (
+#if defined(__DJGPP__) || defined (__CYGWIN__) || defined(__WIN32__)
+	      *cp == ':' || *cp == '\\' ||
+#endif
+	      *cp == '/')
+	    {
+	      slash = cp;
+	      dash = 0;
+	    }
+	}
+
+      cpp_pipe = 0;
+
+      if (dash)
+	{
+	  /* First, try looking for a prefixed gcc in the windres
+	     directory, with the same prefix as windres */
+
+	  cpp_pipe = look_for_default (cmd, program_name, dash-program_name+1,
+				       preprocargs, filename);
+	}
+
+      if (slash && !cpp_pipe)
+	{
+	  /* Next, try looking for a gcc in the same directory as
+             that windres */
+
+	  cpp_pipe = look_for_default (cmd, program_name, slash-program_name+1,
+				       preprocargs, filename);
+	}
+
+      if (!cpp_pipe)
+	{
+	  /* Sigh, try the default */
+
+	  cpp_pipe = look_for_default (cmd, "", 0, preprocargs, filename);
+	}
+
+    }
   if (cpp_pipe == NULL)
     fatal (_("can't popen `%s': %s"), cmd, strerror (errno));
   free (cmd);
diff --git a/binutils/windres.c b/binutils/windres.c
index 885cd51..990db90 100644
--- a/binutils/windres.c
+++ b/binutils/windres.c
@@ -46,6 +46,10 @@
 #include <ctype.h>
 #include <time.h>
 
+/* used by resrc.c at least */
+
+int verbose = 0;
+
 /* An enumeration of format types.  */
 
 enum res_format
@@ -122,6 +126,7 @@
   {"output-format", required_argument, 0, 'O'},
   {"preprocessor", required_argument, 0, OPTION_PREPROCESSOR},
   {"target", required_argument, 0, 'F'},
+  {"verbose", no_argument, 0, 'v'},
   {"version", no_argument, 0, OPTION_VERSION},
   {"yydebug", no_argument, 0, OPTION_YYDEBUG},
   {0, no_argument, 0, 0}
@@ -705,7 +710,9 @@
   -F TARGET, --target TARGET  Specify COFF target\n\
   --preprocessor PROGRAM      Program to use to preprocess rc file\n\
   --include-dir DIR           Include directory when preprocessing rc file\n\
-  --define SYM[=VAL]          Define SYM when preprocessing rc file\n\
+  -DSYM[=VAL], --define SYM[=VAL]\n\
+                              Define SYM when preprocessing rc file\n\
+  -v                          Verbose - tells you what it's doing\n\n
   --language VAL              Set language when reading rc file\n"));
 #ifdef YYDEBUG
   fprintf (stream, _("\
@@ -794,7 +801,7 @@
   preprocargs = NULL;
   language = -1;
 
-  while ((c = getopt_long (argc, argv, "i:o:I:O:F:D:", long_options,
+  while ((c = getopt_long (argc, argv, "i:o:I:O:F:D:v", long_options,
 			   (int *) 0)) != EOF)
     {
       switch (c)
@@ -843,6 +850,10 @@
 	    }
 	  break;
 
+	case 'v':
+	  verbose ++;
+	  break;
+
 	case OPTION_INCLUDE_DIR:
 	  if (preprocargs == NULL)
 	    {
diff --git a/binutils/windres.h b/binutils/windres.h
index a3c789a..db43dd5 100644
--- a/binutils/windres.h
+++ b/binutils/windres.h
@@ -742,6 +742,8 @@
   unsigned char *data;
 };
 
+extern int verbose;
+
 /* Function declarations.  */
 
 extern struct res_directory *read_rc_file