]> git.ipfire.org Git - thirdparty/make.git/commitdiff
Ensure that .ONESHELL works with .SHELLFLAGS options containing whitespace.
authorPaul Smith <psmith@gnu.org>
Sat, 3 Mar 2012 22:56:20 +0000 (22:56 +0000)
committerPaul Smith <psmith@gnu.org>
Sat, 3 Mar 2012 22:56:20 +0000 (22:56 +0000)
See Savannah bug #35397.

ChangeLog
job.c
tests/ChangeLog
tests/scripts/targets/ONESHELL
tests/scripts/variables/SHELL

index 8c05546143d4bb628fae35471ed8cb0abe27d45f..7e1e7f682f7d24a16d0ed37f92ede6cf82d4bcc4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/job.c b/job.c
index d56bfe9eb8a06c34cb51082c4694d1935cdc84de..82612c0f469909c22fd266fa2ee5c0068cef1909 100644 (file)
--- 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;
       }
 
index 2c2284fa1d1c45f5044ea78fa2ffbaf0219c5b4c..7e7db501cc2634a18c01d5adc4e1036881cb7670 100644 (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.
 
index 997423f462b52f5fde3a71c27b8a7e727fd2575b..0660e9250f52935ab758c0d00508bfca1551fe7f 100644 (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!
index 4416ce13aa6eab8e36369689ab6b9028682be84a..3d49349bb7dad7908aa3e4d350603d679cf69c5a 100644 (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