If we're on a DOS/W32/OS2 system and we're not using a unixy shell, don't
authorPaul Smith <psmith@gnu.org>
Thu, 25 Aug 2005 04:40:10 +0000 (04:40 +0000)
committerPaul Smith <psmith@gnu.org>
Thu, 25 Aug 2005 04:40:10 +0000 (04:40 +0000)
follow POSIX backslash/newline conventions.

Use a different method for testing the SHELL variable, which hopefully
will work better on non-UNIX systems.

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

index 8ce5e99..067d8fc 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
        * make_msvc_net2003.vcproj, make_msvc_net2003.sln: MSVC Project files.
        * Makefile.am (EXTRA_DIST): Add MSVC Project files.
 
+2005-07-15  Paul Smith  <psmith@gnu.org>
+
+       * job.c (construct_command_argv_internal) [DOS,WINDOWS32,OS/2]: If
+       we don't have a POSIX shell, then revert to the old
+       backslash-newline behavior (where they are stripped).
+       Fixes bug #13665.
+
 2005-07-08  Paul D. Smith  <psmith@gnu.org>
 
        * config.h.W32.template: Reorder to match the standard config.h,
diff --git a/job.c b/job.c
index 1f49175..18d17e3 100644 (file)
--- a/job.c
+++ b/job.c
@@ -2408,8 +2408,15 @@ construct_command_argv_internal (char *line, char **restp, char *shell,
             {
               /* Backslash-newline is handled differently depending on what
                  kind of string we're in: inside single-quoted strings you
-                 keep them; in double-quoted strings they disappear.  */
-              if (instring == '"')
+                 keep them; in double-quoted strings they disappear.
+                For DOS/Windows/OS2, if we don't have a POSIX shell,
+                we keep the pre-POSIX behavior of removing the
+                backslash-newline.  */
+              if (instring == '"'
+#if defined (__MSDOS__) || defined (__EMX__) || defined (WINDOWS32)
+                 || !unixy_shell
+#endif
+                 )
                 ++p;
               else
                 {
@@ -2693,12 +2700,23 @@ construct_command_argv_internal (char *line, char **restp, char *shell,
          }
        else if (*p == '\\' && p[1] == '\n')
          {
-           /* POSIX says we keep the backslash-newline, but throw out the
-               next char if it's a TAB.  */
-            *(ap++) = '\\';
-            *(ap++) = *(p++);
-            *(ap++) = *p;
+           /* POSIX says we keep the backslash-newline, but throw out
+               the next char if it's a TAB.  If we don't have a POSIX
+               shell on DOS/Windows/OS2, mimic the pre-POSIX behavior
+               and remove the backslash/newline.  */
+#if defined (__MSDOS__) || defined (__EMX__) || defined (WINDOWS32)
+# define PRESERVE_BSNL  unixy_shell
+#else
+# define PRESERVE_BSNL  1
+#endif
+           if (PRESERVE_BSNL)
+             {
+               *(ap++) = '\\';
+               *(ap++) = '\\';
+               *(ap++) = '\n';
+             }
 
+           ++p;
            if (p[1] == '\t')
              ++p;
 
index 9506a3f..84f40f6 100644 (file)
@@ -1,3 +1,9 @@
+2005-08-25  Paul Smith  <psmith@gnu.org>
+
+       * scripts/variables/SHELL: Use a /./ prefix instead of //: the
+       former works better with non-UNIX environments.  Fixes Savannah
+       bug #14129.
+
 2005-08-13  Boris Kolpackov  <boris@kolpackov.net>
 
        * scripts/functions/wildcard: Wrap calls to $(wildcard ) with
index adfa5b1..67593e5 100644 (file)
@@ -19,23 +19,23 @@ run_make_test('all:;@echo "$(SHELL)"', '', $mshell);
 # According to POSIX, any value of SHELL set in the makefile should _NOT_ be
 # exported to the subshell!  I wanted to set SHELL to be $^X (perl) in the
 # makefile, but make runs $(SHELL) -c 'commandline' and that doesn't work at
-# all when $(SHELL) is perl :-/.  So, we just add an extra initial / and hope
-# for the best on non-UNIX platforms :-/.
+# all when $(SHELL) is perl :-/.  So, we just add an extra initial /./ which
+# works well on UNIX and seems to work OK on at least some non-UNIX systems.
 
 $extraENV{SHELL} = $mshell;
 
-run_make_test("SHELL := /$mshell\n".'
+run_make_test("SHELL := /./$mshell\n".'
 all:;@echo "$(SHELL) $$SHELL"
-', '', "/$mshell $mshell");
+', '', "/./$mshell $mshell");
 
 # As a GNU make extension, if make's SHELL variable is explicitly exported,
 # then we really _DO_ export it.
 
 $extraENV{SHELL} = $mshell;
 
-run_make_test("export SHELL := /$mshell\n".'
+run_make_test("export SHELL := /./$mshell\n".'
 all:;@echo "$(SHELL) $$SHELL"
-', '', "/$mshell /$mshell");
+', '', "/./$mshell /./$mshell");
 
 
 # Test out setting of SHELL, both exported and not, as a target-specific
@@ -43,14 +43,14 @@ all:;@echo "$(SHELL) $$SHELL"
 
 $extraENV{SHELL} = $mshell;
 
-run_make_test("all: SHELL := /$mshell\n".'
+run_make_test("all: SHELL := /./$mshell\n".'
 all:;@echo "$(SHELL) $$SHELL"
-', '', "/$mshell $mshell");
+', '', "/./$mshell $mshell");
 
 $extraENV{SHELL} = $mshell;
 
-run_make_test("all: export SHELL := /$mshell\n".'
+run_make_test("all: export SHELL := /./$mshell\n".'
 all:;@echo "$(SHELL) $$SHELL"
-', '', "/$mshell $mshell");
+', '', "/./$mshell $mshell");
 
 1;