diff --git a/ChangeLog b/ChangeLog index 8c055461..7e1e7f68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,11 @@ 2012-03-03 Paul Smith + * 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. diff --git a/job.c b/job.c index d56bfe9e..82612c0f 100644 --- a/job.c +++ b/job.c @@ -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; } diff --git a/tests/ChangeLog b/tests/ChangeLog index 2c2284fa..7e7db501 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,5 +1,11 @@ 2012-03-03 Paul Smith + * 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. diff --git a/tests/scripts/targets/ONESHELL b/tests/scripts/targets/ONESHELL index 997423f4..0660e925 100644 --- a/tests/scripts/targets/ONESHELL +++ b/tests/scripts/targets/ONESHELL @@ -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! diff --git a/tests/scripts/variables/SHELL b/tests/scripts/variables/SHELL index 4416ce13..3d49349b 100644 --- a/tests/scripts/variables/SHELL +++ b/tests/scripts/variables/SHELL @@ -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