mirror of
https://github.com/mirror/make.git
synced 2025-01-09 11:50:46 +08:00
6c06c547dc
POSIX Issue 8 will require a new assignment operator, :::=. This operator behaves similarly to the BSD make := operator: the right-hand side is expanded immediately, but then the value is re-escaped (all '$' are converted to '$$') and the resulting variable is considered a recursive variable: the value is re-expanded on use. * src/variable.h (enum variable_flavor): Add f_expand flavor. * src/variable.c (do_variable_definition): When defining f_expand, post-process the result to re-escape '$' characters. Remove default: to the compiler warns about un-handled enum values. Set recursive values for both f_recursive and f_expand. (parse_variable_definition): Rewrite this method. The previous version was annoying to extend to ':::='. (print_variable): Remove default: so the compiler warns us about un-handled enum values. * src/function.c (func_origin): Remove default: so the compiler warns us about un-handled enum values. * doc/make.texi: Add documentation for :::=. * tests/scripts/variables/define: Add a test for define :::=. * tests/scripts/variables/flavors: Add tests for :::=. * tests/scripts/variables/negative: Add tests for :::=.
201 lines
3.3 KiB
Perl
201 lines
3.3 KiB
Perl
# -*-perl-*-
|
|
|
|
$description = "Test various flavors of make variable setting.";
|
|
|
|
$details = "";
|
|
|
|
# TEST 0: Recursive
|
|
|
|
run_make_test('
|
|
ugh = Goodbye
|
|
foo = $(bar)
|
|
bar = ${ugh}
|
|
ugh = Hello
|
|
all: ; @echo $(foo)
|
|
',
|
|
'', "Hello\n");
|
|
|
|
# TEST 1: Simple
|
|
|
|
run_make_test('
|
|
bar = Goodbye
|
|
foo := $(bar)
|
|
bar = ${ugh}
|
|
ugh = Hello
|
|
all: ; @echo $(foo)
|
|
',
|
|
'', "Goodbye\n");
|
|
|
|
# TEST 2: Append to recursive
|
|
|
|
run_make_test('
|
|
foo = Hello
|
|
ugh = Goodbye
|
|
foo += $(bar)
|
|
bar = ${ugh}
|
|
ugh = Hello
|
|
all: ; @echo $(foo)
|
|
',
|
|
'', "Hello Hello\n");
|
|
|
|
# TEST 3: Append to simple
|
|
|
|
run_make_test('
|
|
foo := Hello
|
|
ugh = Goodbye
|
|
bar = ${ugh}
|
|
foo += $(bar)
|
|
ugh = Hello
|
|
all: ; @echo $(foo)
|
|
',
|
|
'', "Hello Goodbye\n");
|
|
|
|
# TEST 4: Conditional pre-set
|
|
|
|
run_make_test('
|
|
foo = Hello
|
|
ugh = Goodbye
|
|
bar = ${ugh}
|
|
foo ?= $(bar)
|
|
ugh = Hello
|
|
all: ; @echo $(foo)
|
|
',
|
|
'', "Hello\n");
|
|
|
|
# TEST 5: Conditional unset
|
|
|
|
run_make_test('
|
|
ugh = Goodbye
|
|
bar = ${ugh}
|
|
foo ?= $(bar)
|
|
ugh = Hello
|
|
all: ; @echo $(foo)
|
|
',
|
|
'', "Hello\n");
|
|
|
|
# TEST 6: Simple using POSIX syntax
|
|
run_make_test('
|
|
bar = Goodbye
|
|
foo ::= $(bar)
|
|
bar = ${ugh}
|
|
ugh = Hello
|
|
all: ; @echo $(foo)
|
|
',
|
|
'', "Goodbye\n");
|
|
|
|
# TEST 7: POSIX syntax no spaces
|
|
run_make_test('
|
|
bar = Goodbye
|
|
foo::=$(bar)
|
|
bar = ${ugh}
|
|
ugh = Hello
|
|
all: ; @echo $(foo)
|
|
',
|
|
'', "Goodbye\n");
|
|
|
|
# TEST 8: Append to empty
|
|
run_make_test(q!
|
|
recur =
|
|
recur += foo
|
|
simple :=
|
|
simple += bar
|
|
recur_empty = foo
|
|
recur_empty +=
|
|
simple_empty := bar
|
|
simple_empty +=
|
|
empty_recur =
|
|
empty_recur +=
|
|
empty_simple :=
|
|
empty_simple +=
|
|
|
|
all: ; @: $(info recur=/$(recur)/ simple=/$(simple)/ recure=/$(recur_empty)/ simplee=/$(simple_empty)/ erecur=/$(empty_recur)/ esimple=/$(empty_simple)/)
|
|
!,
|
|
'', "recur=/foo/ simple=/bar/ recure=/foo/ simplee=/bar/ erecur=// esimple=//\n");
|
|
|
|
# TEST 9: Line continuation
|
|
run_make_test(q!
|
|
recur = $\
|
|
one$\
|
|
two$\
|
|
three
|
|
simple := $\
|
|
four$\
|
|
five$\
|
|
six
|
|
|
|
all: d$\
|
|
e$\
|
|
p; @:
|
|
|
|
.PHONY: dep
|
|
dep: ; @: $(info recur=/$(recur)/ simple=/$(simple)/)
|
|
!,
|
|
'', "recur=/onetwothree/ simple=/fourfivesix/\n");
|
|
|
|
# TEST 9: Line continuation
|
|
run_make_test(q!
|
|
.POSIX:
|
|
recur = $\
|
|
one$\
|
|
two$\
|
|
three
|
|
simple := $\
|
|
four$\
|
|
five$\
|
|
six
|
|
|
|
all: d$\
|
|
e$\
|
|
p; @:
|
|
|
|
.PHONY: dep
|
|
dep: ; @: $(info recur=/$(recur)/ simple=/$(simple)/)
|
|
!,
|
|
'', "recur=/onetwothree/ simple=/fourfivesix/\n");
|
|
|
|
# Test POSIX :::=
|
|
# This creates a recursive variable, but it expands the RHS first. Any
|
|
# variable escapes ('$$') are preserved so that this recursive variable can be
|
|
# expanded again without changing its contents.
|
|
run_make_test('
|
|
bar = Goodbye
|
|
foo :::= $(bar)
|
|
bar = ${ugh}
|
|
ugh = Hello
|
|
all: ; @echo $(foo)
|
|
',
|
|
'', "Goodbye");
|
|
|
|
# POSIX :::= no spaces
|
|
run_make_test(q!
|
|
bar = Goodbye
|
|
foo:::=$(bar)
|
|
bar = ${ugh}
|
|
ugh = Hello
|
|
all: ; @echo $(foo)
|
|
!,
|
|
'', "Goodbye");
|
|
|
|
# Variable escapes ('$$') are preserved.
|
|
run_make_test(q!
|
|
bar = Good$$bye
|
|
foo :::= $(bar) $$what
|
|
bar = ${ugh}
|
|
ugh = Hello
|
|
all: ; @echo '$(foo)'
|
|
!,
|
|
'', 'Good$bye $what');
|
|
|
|
# Append works as expected
|
|
run_make_test(q!
|
|
bar = Good$$bye
|
|
foo :::= $(bar)
|
|
foo += $$what $(bar)
|
|
bar = ${ugh}
|
|
ugh = Hello
|
|
all: ; @echo '$(foo)'
|
|
!,
|
|
'', 'Good$bye $what Hello');
|
|
|
|
1;
|