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