]> git.ipfire.org Git - thirdparty/make.git/commitdiff
Fix bugs 5798 and 6195.
authorPaul Smith <psmith@gnu.org>
Tue, 4 Nov 2003 07:40:29 +0000 (07:40 +0000)
committerPaul Smith <psmith@gnu.org>
Tue, 4 Nov 2003 07:40:29 +0000 (07:40 +0000)
ChangeLog
expand.c
function.c
tests/ChangeLog
tests/scripts/functions/eval
tests/scripts/functions/if

index e56732a1914f1bf0b619ee80eebfa3509878dd76..4a28b1c959465a112490e4a774187fd7f3ff3859 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2003-11-02  Paul D. Smith  <psmith@gnu.org>
+
+       * function.c (func_if): Strip all the trailing whitespace from the
+       condition, then don't expand it.  Fixed bug # 5798.
+
+       * expand.c (recursively_expand_for_file): If we're expanding a
+       variable with no file context, then use the variable's context.
+       Fixes bug # 6195.
+
 2003-10-21  Paul D. Smith  <psmith@gnu.org>
 
        * main.c (log_working_directory): Add newlines to printf()s.
index 922b1e3f65650697158526de59fab5706564fbc7..8f9f4b1f91f16e6eeb04537b9af48c3295e3d64b 100644 (file)
--- a/expand.c
+++ b/expand.c
@@ -97,6 +97,7 @@ recursively_expand_for_file (struct variable *v, struct file *file)
 {
   char *value;
   struct variable_set_list *save = 0;
+  int set_reading = 0;
 
   if (v->expanding)
     {
@@ -114,6 +115,13 @@ recursively_expand_for_file (struct variable *v, struct file *file)
       current_variable_set_list = file->variables;
     }
 
+  /* If we have no other file-reading context, use the variable's context. */
+  if (!reading_file)
+    {
+      set_reading = 1;
+      reading_file = &v->fileinfo;
+    }
+
   v->expanding = 1;
   if (v->append)
     value = allocated_variable_append (v);
@@ -121,6 +129,8 @@ recursively_expand_for_file (struct variable *v, struct file *file)
     value = allocated_variable_expand (v->value);
   v->expanding = 0;
 
+  if (set_reading)
+    reading_file = 0;
   if (file)
     current_variable_set_list = save;
 
index d05a5bb612928b0177076e9f2a5f7264968e6981..8100a8fc2fce08252d63557a81df92dc866fa099 100644 (file)
@@ -678,6 +678,11 @@ func_words (char *o, char **argv, const char *funcname)
   return o;
 }
 
+/* Set begpp to point to the first non-whitespace character of the string,
+ * and endpp to point to the last non-whitespace character of the string.
+ * If the string is empty or contains nothing but whitespace, endpp will be
+ * begpp-1.
+ */
 static char *
 strip_whitespace (const char **begpp, const char **endpp)
 {
@@ -1134,7 +1139,7 @@ static char *
 func_if (char *o, char **argv, const char *funcname)
 {
   const char *begp = argv[0];
-  const char *endp = begp + strlen (argv[0]);
+  const char *endp = begp + strlen (argv[0]) - 1;
   int result = 0;
 
   /* Find the result of the condition: if we have a value, and it's not
@@ -1143,9 +1148,9 @@ func_if (char *o, char **argv, const char *funcname)
 
   strip_whitespace (&begp, &endp);
 
-  if (begp < endp)
+  if (begp <= endp)
     {
-      char *expansion = expand_argument (begp, NULL);
+      char *expansion = expand_argument (begp, endp+1);
 
       result = strlen (expansion);
       free (expansion);
index 3880e8a93a3f11387b1cc196407c6eab08d51343..0f6da1b828a4abd831ff2170badd8024a7410b01 100644 (file)
@@ -1,3 +1,10 @@
+2003-11-02  Paul D. Smith  <psmith@gnu.org>
+
+       * scripts/functions/if: Test if on conditionals with trailing
+       whitespace--bug #5798.
+
+       * scripts/functions/eval: Test eval in a non-file context--bug #6195.
+
 2003-04-19  Paul D. Smith  <psmith@gnu.org>
 
        * scripts/features/patspecific_vars: Test multiple patterns
index cfb27b22b55b37cefb4f22f3a1c9903ba1feb6bb..372aaf8d07b7c69e9eede0847288011ab44a7948 100644 (file)
@@ -109,4 +109,29 @@ close(MAKEFILE);
 $answer = "[         9 8 7 6 5 4 3 2 1 0 ]\n";
 &compare_output($answer,&get_logfile(1));
 
+
+# TEST eval with no filename context.
+# The trick here is that because EVAR is taken from the environment, it must
+# be evaluated before every command is invoked.  Make sure that works, when
+# we have no file context for reading_file (bug # 6195)
+
+$makefile4 = &get_tmpfile;
+
+open(MAKEFILE,"> $makefile4");
+
+print MAKEFILE <<'EOF';
+EVAR = $(eval FOBAR = 1)
+all: ; @echo "OK"
+
+EOF
+
+close(MAKEFILE);
+
+$ENV{EVAR} = '1';
+&run_make_with_options($makefile4, "", &get_logfile);
+$answer = "OK\n";
+&compare_output($answer,&get_logfile(1));
+
+delete $ENV{EVAR};
+
 1;
index fa2d0dfc489b208fda917adfb59c840ce78dca84..8604e4f2f85097180b9a19bcc32407061fcc5f56 100644 (file)
@@ -8,24 +8,26 @@ open(MAKEFILE, "> $makefile");
 
 print MAKEFILE <<EOMAKE;
 NEQ = \$(subst \$1,,\$2)
+e =
 
 all:
-\t\@echo \$(if    ,true,false)
-\t\@echo \$(if ,true,)
-\t\@echo \$(if ,true)
-\t\@echo \$(if z,true,false)
-\t\@echo \$(if z,true,\$(shell echo hi))
-\t\@echo \$(if ,\$(shell echo hi),false)
-\t\@echo \$(if \$(call NEQ,a,b),true,false)
-\t\@echo \$(if \$(call NEQ,a,a),true,false)
-\t\@echo \$(if z,true,fal,se) hi
-\t\@echo \$(if ,true,fal,se)there
+\t\@echo 1 \$(if    ,true,false)
+\t\@echo 2 \$(if ,true,)
+\t\@echo 3 \$(if ,true)
+\t\@echo 4 \$(if z,true,false)
+\t\@echo 5 \$(if z,true,\$(shell echo hi))
+\t\@echo 6 \$(if ,\$(shell echo hi),false)
+\t\@echo 7 \$(if \$(call NEQ,a,b),true,false)
+\t\@echo 8 \$(if \$(call NEQ,a,a),true,false)
+\t\@echo 9 \$(if z,true,fal,se) hi
+\t\@echo 10 \$(if ,true,fal,se)there
+\t\@echo 11 \$(if \$(e) ,true,false)
 EOMAKE
 
 close(MAKEFILE);
 
 &run_make_with_options($makefile, "", &get_logfile);
-$answer = "false\n\n\ntrue\ntrue\nfalse\ntrue\nfalse\ntrue hi\nfal,sethere\n";
+$answer = "1 false\n2\n3\n4 true\n5 true\n6 false\n7 true\n8 false\n9 true hi\n10 fal,sethere\n11 false\n";
 &compare_output($answer, &get_logfile(1));
 
 1;