See Savannah bug #35397.
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.
*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;
}
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.
[ 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!
!,
'', $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';