1# -*-perl-*- 2 3$description = "Test the eval function."; 4 5$details = "This is a test of the eval function in GNU make. 6This function will evaluate inline makefile syntax and incorporate the 7results into its internal database.\n"; 8 9open(MAKEFILE,"> $makefile"); 10 11print MAKEFILE <<'EOF'; 12define Y 13 all:: ; @echo $AA 14 A = B 15endef 16 17X = $(eval $(value Y)) 18 19$(eval $(shell echo A = A)) 20$(eval $(Y)) 21$(eval A = C) 22$(eval $(X)) 23EOF 24 25close(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 39open(MAKEFILE,"> $makefile2"); 40 41print MAKEFILE <<'EOF'; 42VARS = A B 43 44VARSET = $(1) = $(2) 45 46$(foreach v,$(VARS),$(eval $(call VARSET,$v,$v))) 47 48all: ; @echo A = $(A) B = $(B) 49EOF 50 51close(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 64open(MAKEFILE,"> $makefile3"); 65 66print MAKEFILE <<'EOF'; 67FOO = foo 68 69all:: ; @echo it 70 71define Y 72 all:: ; @echo worked 73endef 74 75ifdef BAR 76$(eval $(Y)) 77endif 78 79EOF 80 81close(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 96open(MAKEFILE,"> $makefile3"); 97 98print MAKEFILE <<'EOF'; 99..9 := 0 1 2 3 4 5 6 7 8 9 100rev=$(eval res:=)$(foreach word,$1,$(eval res:=${word} ${res}))${res} 101a:=$(call rev,${..9}) 102all: ; @echo '[$(a)]' 103 104EOF 105 106close(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 120open(MAKEFILE,"> $makefile4"); 121 122print MAKEFILE <<'EOF'; 123EVAR = $(eval FOBAR = 1) 124all: ; @echo "OK" 125 126EOF 127 128close(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 142run_make_test(' 143define FOO 144all: ; @echo hello \ 145world 146endef 147$(eval $(FOO)) 148', '', 'hello world'); 149 150run_make_test(' 151define FOO 152all: ; @echo '."'".'he\llo'."'".' 153 @echo world 154endef 155$(eval $(FOO)) 156', '', 'he\llo 157world'); 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 165run_make_test('deps: ; $(eval deps: foo)', '', 166 '#MAKEFILE#:1: *** prerequisites cannot be defined in command scripts. Stop.', 167 512); 168 1691; 170