Home | History | Annotate | Download | only in functions
      1 #                                                                    -*-perl-*-
      2 
      3 $description = "Test the eval function.";
      4 
      5 $details = "This is a test of the eval function in GNU make.
      6 This function will evaluate inline makefile syntax and incorporate the
      7 results into its internal database.\n";
      8 
      9 open(MAKEFILE,"> $makefile");
     10 
     11 print MAKEFILE <<'EOF';
     12 define Y
     13   all:: ; @echo $AA
     14   A = B
     15 endef
     16 
     17 X = $(eval $(value Y))
     18 
     19 $(eval $(shell echo A = A))
     20 $(eval $(Y))
     21 $(eval A = C)
     22 $(eval $(X))
     23 EOF
     24 
     25 close(MAKEFILE);
     26 
     27 &run_make_with_options($makefile, "", &get_logfile);
     28 
     29 # Create the answer to what should be produced by this Makefile
     30 $answer = "AA\nBA\n";
     31 
     32 &compare_output($answer,&get_logfile(1));
     33 
     34 # Test to make sure defining variables when we have extra scope pushed works
     35 # as expected.
     36 
     37 $makefile2 = &get_tmpfile;
     38 
     39 open(MAKEFILE,"> $makefile2");
     40 
     41 print MAKEFILE <<'EOF';
     42 VARS = A B
     43 
     44 VARSET = $(1) = $(2)
     45 
     46 $(foreach v,$(VARS),$(eval $(call VARSET,$v,$v)))
     47 
     48 all: ; @echo A = $(A) B = $(B)
     49 EOF
     50 
     51 close(MAKEFILE);
     52 
     53 &run_make_with_options($makefile2, "", &get_logfile);
     54 
     55 # Create the answer to what should be produced by this Makefile
     56 $answer = "A = A B = B\n";
     57 
     58 &compare_output($answer,&get_logfile(1));
     59 
     60 # Test to make sure eval'ing inside conditionals works properly
     61 
     62 $makefile3 = &get_tmpfile;
     63 
     64 open(MAKEFILE,"> $makefile3");
     65 
     66 print MAKEFILE <<'EOF';
     67 FOO = foo
     68 
     69 all:: ; @echo it
     70 
     71 define Y
     72   all:: ; @echo worked
     73 endef
     74 
     75 ifdef BAR
     76 $(eval $(Y))
     77 endif
     78 
     79 EOF
     80 
     81 close(MAKEFILE);
     82 
     83 &run_make_with_options($makefile3, "", &get_logfile);
     84 $answer = "it\n";
     85 &compare_output($answer,&get_logfile(1));
     86 
     87 &run_make_with_options($makefile3, "BAR=1", &get_logfile);
     88 $answer = "it\nworked\n";
     89 &compare_output($answer,&get_logfile(1));
     90 
     91 
     92 # TEST very recursive invocation of eval
     93 
     94 $makefile3 = &get_tmpfile;
     95 
     96 open(MAKEFILE,"> $makefile3");
     97 
     98 print MAKEFILE <<'EOF';
     99 ..9 := 0 1 2 3 4 5 6 7 8 9
    100 rev=$(eval res:=)$(foreach word,$1,$(eval res:=${word} ${res}))${res}
    101 a:=$(call rev,${..9})
    102 all: ; @echo '[$(a)]'
    103 
    104 EOF
    105 
    106 close(MAKEFILE);
    107 
    108 &run_make_with_options($makefile3, "", &get_logfile);
    109 $answer = "[         9 8 7 6 5 4 3 2 1 0 ]\n";
    110 &compare_output($answer,&get_logfile(1));
    111 
    112 
    113 # TEST eval with no filename context.
    114 # The trick here is that because EVAR is taken from the environment, it must
    115 # be evaluated before every command is invoked.  Make sure that works, when
    116 # we have no file context for reading_file (bug # 6195)
    117 
    118 $makefile4 = &get_tmpfile;
    119 
    120 open(MAKEFILE,"> $makefile4");
    121 
    122 print MAKEFILE <<'EOF';
    123 EVAR = $(eval FOBAR = 1)
    124 all: ; @echo "OK"
    125 
    126 EOF
    127 
    128 close(MAKEFILE);
    129 
    130 $extraENV{EVAR} = '1';
    131 &run_make_with_options($makefile4, "", &get_logfile);
    132 $answer = "OK\n";
    133 &compare_output($answer,&get_logfile(1));
    134 
    135 
    136 # Clean out previous information to allow new run_make_test() interface.
    137 # If we ever convert all the above to run_make_test() we can remove this line.
    138 $makefile = undef;
    139 
    140 # Test handling of backslashes in strings to be evaled.
    141 
    142 run_make_test('
    143 define FOO
    144 all: ; @echo hello \
    145 world
    146 endef
    147 $(eval $(FOO))
    148 ', '', 'hello world');
    149 
    150 run_make_test('
    151 define FOO
    152 all: ; @echo '."'".'he\llo'."'".'
    153 	@echo world
    154 endef
    155 $(eval $(FOO))
    156 ', '', 'he\llo
    157 world');
    158 
    159 
    160 # We don't allow new target/prerequisite relationships to be defined within a
    161 # command script, because these are evaluated after snap_deps() and that
    162 # causes lots of problems (like core dumps!)
    163 # See Savannah bug # 12124.
    164 
    165 run_make_test('deps: ; $(eval deps: foo)', '',
    166               '#MAKEFILE#:1: *** prerequisites cannot be defined in command scripts.  Stop.',
    167               512);
    168 
    169 1;
    170