Ensure that .ONESHELL works with .SHELLFLAGS options containing whitespace.

See Savannah bug #35397.
This commit is contained in:
Paul Smith 2012-03-03 22:56:20 +00:00
parent a77c5c0910
commit 405c89ba1e
5 changed files with 54 additions and 6 deletions

View File

@ -1,8 +1,11 @@
2012-03-03 Paul Smith <psmith@gnu.org>
* job.c (construct_command_argv_internal): In oneshell we need to
break the SHELLFLAGS up for argv. Fixes Savannah bug #35397.
* function.c (func_filter_filterout): Recompute the length of each
filter word in case it was compressed due to escape chars. Don't
reset the string as it's freed. See Savannah bug #35410.
reset the string as it's freed. Fixes Savannah bug #35410.
* misc.c (collapse_continuations): Only use POSIX-style
backslash/newline handling if the .POSIX target is set.

28
job.c
View File

@ -2960,11 +2960,29 @@ construct_command_argv_internal (char *line, char **restp, char *shell,
*t = '\0';
}
new_argv = xmalloc (4 * sizeof (char *));
new_argv[0] = xstrdup(shell);
new_argv[1] = xstrdup(shellflags ? shellflags : "");
new_argv[2] = line;
new_argv[3] = NULL;
/* Create an argv list for the shell command line. */
{
int n = 0;
new_argv = xmalloc ((4 + sflags_len/2) * sizeof (char *));
new_argv[n++] = xstrdup (shell);
/* Chop up the shellflags (if any) and assign them. */
if (! shellflags)
new_argv[n++] = xstrdup ("");
else
{
const char *s = shellflags;
char *t;
unsigned int len;
while ((t = find_next_token (&s, &len)) != 0)
new_argv[n++] = xstrndup (t, len);
}
/* Set the command to invoke. */
new_argv[n++] = line;
new_argv[n++] = NULL;
}
return new_argv;
}

View File

@ -1,5 +1,11 @@
2012-03-03 Paul Smith <psmith@gnu.org>
* scripts/variables/SHELL: Ensure .SHELLFLAGS works with options
separated by whitespace.
* scripts/targets/ONESHELL: Try .ONESHELL in combination with
whitespace-separated options in .SHELLFLAGS. See Savannah bug #35397.
* scripts/functions/filter-out: Add filter tests and test escape
operations. See Savannah bug #35410.

View File

@ -17,6 +17,19 @@ all:
[ 0"$a" -eq "$$" ] || echo fail
');
# Simple but use multi-word SHELLFLAGS
run_make_test(q!
.ONESHELL:
.SHELLFLAGS = -e -c
all:
a=$$$$
[ 0"$$a" -eq "$$$$" ] || echo fail
!,
'', 'a=$$
[ 0"$a" -eq "$$" ] || echo fail
');
# Again, but this time with inner prefix chars
run_make_test(q!

View File

@ -64,6 +64,14 @@ my $script = 'true; true';
my $flags = '-xc';
my $out = `/bin/sh $flags '$script' 2>&1`;
run_make_test(qq!
.SHELLFLAGS = $flags
all: ; \@$script
!,
'', $out);
# Do it again but add spaces to SHELLFLAGS
$flags = '-x -c';
run_make_test(qq!
.SHELLFLAGS = $flags
all: ; \@$script