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;