mirror of
https://git.savannah.gnu.org/git/make.git
synced 2024-12-29 00:05:58 +00:00
43d81ff866
Allows the user to reset the prefix character for introducing recipe lines from the default (tab) to any other single character, and back again. Also, reworked the manual to consistently use the word "recipe" to describe the set of commands we use to update a target, instead of the various phrases used in the past: "commands", "command lines", "command scripts", etc.
169 lines
3.4 KiB
Perl
169 lines
3.4 KiB
Perl
# -*-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 recipes. Stop.',
|
|
512);
|
|
|
|
1;
|