windres: add quotes around preprocessor cmd if needed

This patch ensures that the gcc binary called by windres is quoted if
needed. Otherwise, errors can occur if the gcc is under a folder having
a name containing a space (eg "Program Files").

binutils/
	* resrc.c (DEFAULT_PREPROCESSOR): Split into...
	(DEFAULT_PREPROCESSOR_CMD): that...
	(DEFAULT_PREPROCESSOR_ARGS): and that.
	(look_for_default): Add quotes around the command if needed.
	(read_rc_file): Adapt to new defines.
This commit is contained in:
Clément Chigot
2022-06-16 13:43:26 +02:00
parent dbcbf67ca5
commit fadaf8f7f9

View File

@ -75,7 +75,8 @@
/* The default preprocessor. */ /* The default preprocessor. */
#define DEFAULT_PREPROCESSOR "gcc -E -xc -DRC_INVOKED" #define DEFAULT_PREPROCESSOR_CMD "gcc"
#define DEFAULT_PREPROCESSOR_ARGS "-E -xc -DRC_INVOKED"
/* We read the directory entries in a cursor or icon file into /* We read the directory entries in a cursor or icon file into
instances of this structure. */ instances of this structure. */
@ -378,17 +379,13 @@ static FILE *
look_for_default (char *cmd, const char *prefix, int end_prefix, look_for_default (char *cmd, const char *prefix, int end_prefix,
const char *preprocargs, const char *filename) const char *preprocargs, const char *filename)
{ {
char *space;
int found; int found;
struct stat s; struct stat s;
const char *fnquotes = (filename_need_quotes (filename) ? "\"" : ""); const char *fnquotes = (filename_need_quotes (filename) ? "\"" : "");
strcpy (cmd, prefix); strcpy (cmd, prefix);
sprintf (cmd + end_prefix, "%s", DEFAULT_PREPROCESSOR); sprintf (cmd + end_prefix, "%s", DEFAULT_PREPROCESSOR_CMD);
space = strchr (cmd + end_prefix, ' ');
if (space)
*space = 0;
if ( if (
#if defined (__DJGPP__) || defined (__CYGWIN__) || defined (_WIN32) #if defined (__DJGPP__) || defined (__CYGWIN__) || defined (_WIN32)
@ -410,10 +407,16 @@ look_for_default (char *cmd, const char *prefix, int end_prefix,
} }
} }
strcpy (cmd, prefix); if (filename_need_quotes (cmd))
{
char *cmd_copy = xmalloc (strlen (cmd));
strcpy (cmd_copy, cmd);
sprintf (cmd, "\"%s\"", cmd_copy);
free (cmd_copy);
}
sprintf (cmd + end_prefix, "%s %s %s%s%s", sprintf (cmd + strlen (cmd), " %s %s %s%s%s",
DEFAULT_PREPROCESSOR, preprocargs, fnquotes, filename, fnquotes); DEFAULT_PREPROCESSOR_ARGS, preprocargs, fnquotes, filename, fnquotes);
if (verbose) if (verbose)
fprintf (stderr, _("Using `%s'\n"), cmd); fprintf (stderr, _("Using `%s'\n"), cmd);
@ -490,10 +493,9 @@ read_rc_file (const char *filename, const char *preprocessor,
{ {
char *dash, *slash, *cp; char *dash, *slash, *cp;
preprocessor = DEFAULT_PREPROCESSOR;
cmd = xmalloc (strlen (program_name) cmd = xmalloc (strlen (program_name)
+ strlen (preprocessor) + strlen (DEFAULT_PREPROCESSOR_CMD)
+ strlen (DEFAULT_PREPROCESSOR_ARGS)
+ strlen (preprocargs) + strlen (preprocargs)
+ strlen (filename) + strlen (filename)
+ strlen (fnquotes) * 2 + strlen (fnquotes) * 2