# -*-perl-*- $description = "Test the eval function."; $details = "This is a test of the eval function in GNU make. This function will evaluate inline makefile syntax and incorporate the results into its internal database.\n"; open(MAKEFILE,"> $makefile"); print MAKEFILE <<'EOF'; define Y all:: ; @echo $AA A = B endef X = $(eval $(value Y)) $(eval $(shell echo A = A)) $(eval $(Y)) $(eval A = C) $(eval $(X)) EOF close(MAKEFILE); &run_make_with_options($makefile, "", &get_logfile); # Create the answer to what should be produced by this Makefile $answer = "AA\nBA\n"; &compare_output($answer,&get_logfile(1)); # Test to make sure defining variables when we have extra scope pushed works # as expected. $makefile2 = &get_tmpfile; open(MAKEFILE,"> $makefile2"); print MAKEFILE <<'EOF'; VARS = A B VARSET = $(1) = $(2) $(foreach v,$(VARS),$(eval $(call VARSET,$v,$v))) all: ; @echo A = $(A) B = $(B) EOF close(MAKEFILE); &run_make_with_options($makefile2, "", &get_logfile); # Create the answer to what should be produced by this Makefile $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)); # TEST very recursive invocation of eval $makefile3 = &get_tmpfile; open(MAKEFILE,"> $makefile3"); print MAKEFILE <<'EOF'; ..9 := 0 1 2 3 4 5 6 7 8 9 rev=$(eval res:=)$(foreach word,$1,$(eval res:=${word} ${res}))${res} a:=$(call rev,${..9}) all: ; @echo '[$(a)]' EOF close(MAKEFILE); &run_make_with_options($makefile3, "", &get_logfile); $answer = "[ 9 8 7 6 5 4 3 2 1 0 ]\n"; &compare_output($answer,&get_logfile(1)); # TEST eval with no filename context. # The trick here is that because EVAR is taken from the environment, it must # be evaluated before every command is invoked. Make sure that works, when # we have no file context for reading_file (bug # 6195) $makefile4 = &get_tmpfile; open(MAKEFILE,"> $makefile4"); print MAKEFILE <<'EOF'; EVAR = $(eval FOBAR = 1) all: ; @echo "OK" EOF close(MAKEFILE); $extraENV{EVAR} = '1'; &run_make_with_options($makefile4, "", &get_logfile); $answer = "OK\n"; &compare_output($answer,&get_logfile(1)); # Clean out previous information to allow new run_make_test() interface. # If we ever convert all the above to run_make_test() we can remove this line. $makefile = undef; # Test handling of backslashes in strings to be evaled. run_make_test(' define FOO all: ; @echo hello \ world endef $(eval $(FOO)) ', '', 'hello world'); run_make_test(' define FOO all: ; @echo '."'".'he\llo'."'".' @echo world endef $(eval $(FOO)) ', '', 'he\llo world'); # We don't allow new target/prerequisite relationships to be defined within a # command script, because these are evaluated after snap_deps() and that # causes lots of problems (like core dumps!) # See Savannah bug # 12124. run_make_test('deps: ; $(eval deps: foo)', '', '#MAKEFILE#:1: *** prerequisites cannot be defined in command scripts. Stop.', 512); 1;