Fix bug #10252: Remove any trailing slashes from -C arguments (WINDOWS32).
authorPaul Smith <psmith@gnu.org>
Mon, 29 Nov 2004 01:35:13 +0000 (01:35 +0000)
committerPaul Smith <psmith@gnu.org>
Mon, 29 Nov 2004 01:35:13 +0000 (01:35 +0000)
Add a regression test for "@" before a define/enddef vs. one inside.

ChangeLog
main.c
tests/ChangeLog
tests/scripts/options/dash-C
tests/scripts/variables/flavors

index b1dcefd76a3e69b0d59717bddf817fb88d5ca01d..e6e733481dfe1239ec1b62a5e38ae423433ba2e8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2004-11-28  Paul D. Smith  <psmith@gnu.org>
 
+       * main.c (main) [WINDOWS32]: Remove any trailing slashes from -C
+       arguments.  Fixes bug #10252.
+
        Fix for bug #1276: Handle SHELL according to POSIX requirements.
 
        * main.c (main): Set SHELL to v_noexport by default.  Remember the
diff --git a/main.c b/main.c
index f0229eef185e883e2b7ea3476b9ea6158ead336e..700e4ba10db8faf3a6fe69e7865af5b3d57f19ad 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1273,16 +1273,27 @@ main (int argc, char **argv, char **envp)
     for (i = 0; directories->list[i] != 0; ++i)
       {
        char *dir = directories->list[i];
+        char *expanded = 0;
        if (dir[0] == '~')
          {
-           char *expanded = tilde_expand (dir);
+            expanded = tilde_expand (dir);
            if (expanded != 0)
              dir = expanded;
          }
+#ifdef WINDOWS32
+        /* WINDOWS32 chdir() doesn't work if the directory has a trailing '/'
+           But allow -C/ just in case someone wants that.  */
+        {
+          char *p = dir + strlen (dir) - 1;
+          while (p > dir && (p[0] == '/' || p[0] == '\\'))
+            --p;
+          p[1] = '\0';
+        }
+#endif
        if (chdir (dir) < 0)
          pfatal_with_name (dir);
-       if (dir != directories->list[i])
-         free (dir);
+       if (expanded)
+         free (expanded);
       }
 
 #ifdef WINDOWS32
index a6423b072a164cabe295fd707f33c1eafbc9b5e3..cef8a331fc84915c77d4983dcd9382581e62b5c3 100644 (file)
@@ -1,5 +1,8 @@
 2004-11-28  Paul D. Smith  <psmith@gnu.org>
 
+       * scripts/options/dash-C [WINDOWS32]: Add a test for bug #10252;
+       this doesn't really test anything useful in UNIX but...
+
        * scripts/variables/SHELL: New file: test proper handling of SHELL
        according to POSIX rules.  Fixes bug #1276.
 
index f31238f18675e159fb60e2d29240a5087873c470..5864ffd22a96244625da034c43bfc076fe63c2dd 100644 (file)
@@ -1,32 +1,56 @@
-$description = "The following test creates a makefile to test the -C dir \n"
-              ."option in make.  This option tells make to change to \n"
-              ."directory dir before reading the makefile.";
+#                                                                    -*-perl-*-
 
-$details = "This test is similar to the clean test except that this test\n"
-          ."creates the file to delete in the work directory instead of\n"
-          ."the current directory.  Make is called from another directory\n"
-          ."using the -C workdir option so that it can both find the \n"
-          ."makefile and the file to delete in the work directory. ";
+$description = "Test the -C option to GNU make.";
 
-$example = $workdir . $pathsep . "EXAMPLE_FILE";
+$details = "\
+This test is similar to the clean test except that this test creates the file
+to delete in the work directory instead of the current directory.  Make is
+called from another directory using the -C workdir option so that it can both
+find the makefile and the file to delete in the work directory.";
+
+$example = $workdir . $pathsep . "EXAMPLE";
 
 open(MAKEFILE,"> $makefile");
+print MAKEFILE <<EOF;
+all: ; \@echo This makefile did not clean the dir ... good
+clean: ; $delete_command EXAMPLE\$(ext)
+EOF
+close(MAKEFILE);
 
-# The Contents of the MAKEFILE ...
+# TEST #1
+# -------
+&touch($example);
 
-print MAKEFILE "all: \n";
-print MAKEFILE "\t\@echo This makefile did not clean the dir ... good\n";
-print MAKEFILE "clean: \n";
-print MAKEFILE "\t$delete_command EXAMPLE_FILE\n";
+&run_make_with_options("${testname}.mk",
+                      "-C $workdir clean",
+                      &get_logfile);
 
-# END of Contents of MAKEFILE
+chdir $workdir;
+$wpath = &get_this_pwd;
+chdir $pwd;
 
-close(MAKEFILE);
+if (-f $example) {
+  $test_passed = 0;
+}
+
+# Create the answer to what should be produced by this Makefile
+$answer = "$make_name: Entering directory `$wpath'\n"
+        . "$delete_command EXAMPLE\n"
+        . "$make_name: Leaving directory `$wpath'\n";
+
+&compare_output($answer,&get_logfile(1));
+
+
+# TEST #2
+# -------
+# Do it again with trailing "/"; this should work the same
+
+$example .= "slash";
 
 &touch($example);
 
 &run_make_with_options("${testname}.mk",
-                      "-C $workdir clean",
+                      "-C $workdir/ clean ext=slash",
                       &get_logfile);
 
 chdir $workdir;
@@ -39,7 +63,7 @@ if (-f $example) {
 
 # Create the answer to what should be produced by this Makefile
 $answer = "$make_name: Entering directory `$wpath'\n"
-        . "$delete_command EXAMPLE_FILE\n"
+        . "$delete_command EXAMPLEslash\n"
         . "$make_name: Leaving directory `$wpath'\n";
 
 &compare_output($answer,&get_logfile(1));
index 88e9ad59daa0ba39130dcf8a24f7da12ec310b29..3ceac5e82788034660de17674f33542a1c791b15 100644 (file)
@@ -155,4 +155,29 @@ world');
 run_make_test(undef, 'V1=@ V2=@', 'hello
 world');
 
+# TEST #10
+# -------
+# Test the basics; a "@" internally to the variable applies to only one line.
+# A "@" before the variable applies to the entire variable.
+
+run_make_test('
+define FOO
+@echo hello
+echo world
+endef
+define BAR
+echo hello
+echo world
+endef
+
+all: foo bar
+foo: ; $(FOO)
+bar: ; @$(BAR)
+', '', 'hello
+echo world
+world
+hello
+world
+');
+
 1;