123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- 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;
|