#                                                                    -*-perl-*-

$description = "Test various flavors of make variable setting.";

$details = "";

open(MAKEFILE, "> $makefile");

# The Contents of the MAKEFILE ...

print MAKEFILE <<'EOF';
foo = $(bar)
bar = ${ugh}
ugh = Hello

all: multi ; @echo $(foo)

multi: ; $(multi)

x := foo
y := $(x) bar
x := later

nullstring :=
space := $(nullstring) $(nullstring)

next: ; @echo $x$(space)$y

define multi
@echo hi
echo there
endef

ifdef BOGUS
define
@echo error
endef
endif

define outer
 define inner
  A = B
 endef
endef

$(eval $(outer))

outer: ; @echo $(inner)

EOF

# END of Contents of MAKEFILE

close(MAKEFILE);

# TEST #1
# -------

&run_make_with_options($makefile, "", &get_logfile);
$answer = "hi\necho there\nthere\nHello\n";
&compare_output($answer, &get_logfile(1));

# TEST #2
# -------

&run_make_with_options($makefile, "next", &get_logfile);
$answer = "later foo bar\n";
&compare_output($answer, &get_logfile(1));

# TEST #3
# -------

&run_make_with_options($makefile, "BOGUS=true", &get_logfile, 512);
$answer = "$makefile:24: *** empty variable name.  Stop.\n";
&compare_output($answer, &get_logfile(1));

# TEST #4
# -------

&run_make_with_options($makefile, "outer", &get_logfile);
$answer = "A = B\n";
&compare_output($answer, &get_logfile(1));

# Clean up from "old style" testing.  If all the above tests are converted to
# run_make_test() syntax than this line can be removed.
$makefile = undef;

# -------------------------
# Make sure that prefix characters apply properly to define/endef values.
#
# There's a bit of oddness here if you try to use a variable to hold the
# prefix character for a define.  Even though something like this:
#
#       define foo
#       echo bar
#       endef
#
#       all: ; $(V)$(foo)
#
# (where V=@) can be seen by the user to be obviously different than this:
#
#       define foo
#       $(V)echo bar
#       endef
#
#       all: ; $(foo)
#
# and the user thinks it should behave the same as when the "@" is literal
# instead of in a variable, that can't happen because by the time make
# expands the variables for the command line and sees it begins with a "@" it
# can't know anymore whether the prefix character came before the variable
# reference or was included in the first line of the variable reference.

# TEST #5
# -------

run_make_test('
define FOO
$(V1)echo hello
$(V2)echo world
endef
all: ; @$(FOO)
', '', 'hello
world');

# TEST #6
# -------

run_make_test(undef, 'V1=@ V2=@', 'hello
world');

# TEST #7
# -------

run_make_test('
define FOO
$(V1)echo hello
$(V2)echo world
endef
all: ; $(FOO)
', 'V1=@', 'hello
echo world
world');

# TEST #8
# -------

run_make_test(undef, 'V2=@', 'echo hello
hello
world');

# TEST #9
# -------

run_make_test(undef, 'V1=@ V2=@', 'hello
world');

# TEST #10
# -------
# Test the basics; a "@" internally to the variable applies to only one line.
# A "@" before the variable applies to the entire variable.

run_make_test('
define FOO
@echo hello
echo world
endef
define BAR
echo hello
echo world
endef

all: foo bar
foo: ; $(FOO)
bar: ; @$(BAR)
', '', 'hello
echo world
world
hello
world
');

1;
