From 751d21b5b946a4a451552fbac692b14abea3d816 Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Tue, 25 May 1999 12:10:27 +0000 Subject: [PATCH] * 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). --- binutils/ChangeLog | 9 ++++ binutils/binutils.texi | 5 ++ binutils/resrc.c | 121 +++++++++++++++++++++++++++++++++++++++++++++---- binutils/windres.c | 15 +++++- binutils/windres.h | 2 + 5 files changed, 141 insertions(+), 11 deletions(-) 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 + + * 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 * 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 @@ Specify an include directory to use when reading an @code{rc} file. 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 @@ static void get_data 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 @@ read_rc_file (filename, preprocessor, preprocargs, language) { 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 #include +/* used by resrc.c at least */ + +int verbose = 0; + /* An enumeration of format types. */ enum res_format @@ -122,6 +126,7 @@ static const struct option long_options[] = {"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 @@ Options:\n\ -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 @@ main (argc, argv) 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 @@ main (argc, argv) } 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 @@ struct bindata unsigned char *data; }; +extern int verbose; + /* Function declarations. */ extern struct res_directory *read_rc_file -- 2.7.4