|
|
Fix from upstream
|
|
|
|
|
|
https://savannah.gnu.org/bugs/index.php?func=detailitem&item_id=1516
|
|
|
http://bugs.gentoo.org/123317
|
|
|
|
|
|
Index: read.c
|
|
|
===================================================================
|
|
|
RCS file: /cvsroot/make/make/read.c,v
|
|
|
retrieving revision 1.124
|
|
|
retrieving revision 1.125
|
|
|
diff -u -p -r1.124 -r1.125
|
|
|
--- read.c 14 Oct 2002 21:54:04 -0000 1.124
|
|
|
+++ read.c 25 Oct 2002 22:01:47 -0000 1.125
|
|
|
@@ -272,6 +272,34 @@ read_all_makefiles (char **makefiles)
|
|
|
return read_makefiles;
|
|
|
}
|
|
|
|
|
|
+/* Install a new conditional and return the previous one. */
|
|
|
+
|
|
|
+static struct conditionals *
|
|
|
+install_conditionals (struct conditionals *new)
|
|
|
+{
|
|
|
+ struct conditionals *save = conditionals;
|
|
|
+
|
|
|
+ bzero ((char *) new, sizeof (*new));
|
|
|
+ conditionals = new;
|
|
|
+
|
|
|
+ return save;
|
|
|
+}
|
|
|
+
|
|
|
+/* Free the current conditionals and reinstate a saved one. */
|
|
|
+
|
|
|
+static void
|
|
|
+restore_conditionals (struct conditionals *saved)
|
|
|
+{
|
|
|
+ /* Free any space allocated by conditional_line. */
|
|
|
+ if (conditionals->ignoring)
|
|
|
+ free (conditionals->ignoring);
|
|
|
+ if (conditionals->seen_else)
|
|
|
+ free (conditionals->seen_else);
|
|
|
+
|
|
|
+ /* Restore state. */
|
|
|
+ conditionals = saved;
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
eval_makefile (char *filename, int flags)
|
|
|
{
|
|
|
@@ -388,6 +416,8 @@ int
|
|
|
eval_buffer (char *buffer)
|
|
|
{
|
|
|
struct ebuffer ebuf;
|
|
|
+ struct conditionals *saved;
|
|
|
+ struct conditionals new;
|
|
|
const struct floc *curfile;
|
|
|
int r;
|
|
|
|
|
|
@@ -402,8 +432,12 @@ eval_buffer (char *buffer)
|
|
|
curfile = reading_file;
|
|
|
reading_file = &ebuf.floc;
|
|
|
|
|
|
+ saved = install_conditionals (&new);
|
|
|
+
|
|
|
r = eval (&ebuf, 1);
|
|
|
|
|
|
+ restore_conditionals (saved);
|
|
|
+
|
|
|
reading_file = curfile;
|
|
|
|
|
|
return r;
|
|
|
@@ -412,13 +446,8 @@ eval_buffer (char *buffer)
|
|
|
|
|
|
/* Read file FILENAME as a makefile and add its contents to the data base.
|
|
|
|
|
|
- SET_DEFAULT is true if we are allowed to set the default goal.
|
|
|
+ SET_DEFAULT is true if we are allowed to set the default goal. */
|
|
|
|
|
|
- FILENAME is added to the `read_makefiles' chain.
|
|
|
-
|
|
|
- Returns 0 if a file was not found or not read.
|
|
|
- Returns 1 if FILENAME was found and read.
|
|
|
- Returns 2 if FILENAME was read, and we kept a reference (don't free it). */
|
|
|
|
|
|
static int
|
|
|
eval (struct ebuffer *ebuf, int set_default)
|
|
|
@@ -782,9 +811,7 @@ eval (struct ebuffer *ebuf, int set_defa
|
|
|
|
|
|
/* Save the state of conditionals and start
|
|
|
the included makefile with a clean slate. */
|
|
|
- save = conditionals;
|
|
|
- bzero ((char *) &new_conditionals, sizeof new_conditionals);
|
|
|
- conditionals = &new_conditionals;
|
|
|
+ save = install_conditionals (&new_conditionals);
|
|
|
|
|
|
/* Record the rules that are waiting so they will determine
|
|
|
the default goal before those in the included makefile. */
|
|
|
@@ -810,14 +837,8 @@ eval (struct ebuffer *ebuf, int set_defa
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /* Free any space allocated by conditional_line. */
|
|
|
- if (conditionals->ignoring)
|
|
|
- free (conditionals->ignoring);
|
|
|
- if (conditionals->seen_else)
|
|
|
- free (conditionals->seen_else);
|
|
|
-
|
|
|
- /* Restore state. */
|
|
|
- conditionals = save;
|
|
|
+ /* Restore conditional state. */
|
|
|
+ restore_conditionals (save);
|
|
|
|
|
|
goto rule_complete;
|
|
|
}
|
|
|
Index: tests/scripts/functions/eval
|
|
|
===================================================================
|
|
|
RCS file: /cvsroot/make/make/tests/scripts/functions/eval,v
|
|
|
retrieving revision 1.1
|
|
|
retrieving revision 1.2
|
|
|
diff -u -p -r1.1 -r1.2
|
|
|
--- tests/scripts/functions/eval 8 Jul 2002 02:26:48 -0000 1.1
|
|
|
+++ tests/scripts/functions/eval 25 Oct 2002 22:01:47 -0000 1.2
|
|
|
@@ -57,4 +57,35 @@ $answer = "A = A B = B\n";
|
|
|
|
|
|
&compare_output($answer,&get_logfile(1));
|
|
|
|
|
|
+# Test to make sure eval'ing inside conditionals works properly
|
|
|
+
|
|
|
+$makefile3 = &get_tmpfile;
|
|
|
+
|
|
|
+open(MAKEFILE,"> $makefile3");
|
|
|
+
|
|
|
+print MAKEFILE <<'EOF';
|
|
|
+FOO = foo
|
|
|
+
|
|
|
+all:: ; @echo it
|
|
|
+
|
|
|
+define Y
|
|
|
+ all:: ; @echo worked
|
|
|
+endef
|
|
|
+
|
|
|
+ifdef BAR
|
|
|
+$(eval $(Y))
|
|
|
+endif
|
|
|
+
|
|
|
+EOF
|
|
|
+
|
|
|
+close(MAKEFILE);
|
|
|
+
|
|
|
+&run_make_with_options($makefile3, "", &get_logfile);
|
|
|
+$answer = "it\n";
|
|
|
+&compare_output($answer,&get_logfile(1));
|
|
|
+
|
|
|
+&run_make_with_options($makefile3, "BAR=1", &get_logfile);
|
|
|
+$answer = "it\nworked\n";
|
|
|
+&compare_output($answer,&get_logfile(1));
|
|
|
+
|
|
|
1;
|