From 2a94ecf6e317c675d415d27215138bb2a8e57f73 Mon Sep 17 00:00:00 2001 From: psmith Date: Sat, 3 Mar 2012 22:56:20 +0000 Subject: [PATCH] Ensure that .ONESHELL works with .SHELLFLAGS options containing whitespace. See Savannah bug #35397. --- ChangeLog | 5 ++++- job.c | 28 +++++++++++++++++++++++----- tests/ChangeLog | 6 ++++++ tests/scripts/targets/ONESHELL | 13 +++++++++++++ tests/scripts/variables/SHELL | 8 ++++++++ 5 files changed, 54 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8c05546..7e1e7f6 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 d56bfe9..82612c0 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 2c2284f..7e7db50 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 997423f..0660e92 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 4416ce1..3d49349 100644 --- a/tests/scripts/variables/SHELL +++ b/tests/scripts/variables/SHELL @@ -70,6 +70,14 @@ all: ; \@$script !, '', $out); +# Do it again but add spaces to SHELLFLAGS +$flags = '-x -c'; +run_make_test(qq! +.SHELLFLAGS = $flags +all: ; \@$script +!, + '', $out); + # We can't just use "false" because on different systems it provides a # different exit code--once again Solaris: false exits with 255 not 1 $script = 'true; false; true'; -- 2.11.4.GIT