mirror of
https://github.com/mirror/make.git
synced 2025-01-04 09:20:43 +08:00
8791d2b38e
If a parent target has an exported variable that is private, don't export it in child targets. * NEWS: Mention this change. * src/variable.c (target_environment): Ignore private inherited variables. * tests/thelp.pl: Add a new "env" operation to show env.var. values. * tests/scripts/variables/private: Verify this new behavior.
178 lines
3.2 KiB
Perl
178 lines
3.2 KiB
Perl
# -*-perl-*-
|
|
|
|
$description = "Test 'private' variables.";
|
|
|
|
$details = "";
|
|
|
|
# 1: Simple verification that private variables are not inherited
|
|
&run_make_test('
|
|
a:
|
|
F = g
|
|
a: F = a
|
|
b: private F = b
|
|
|
|
a b c: ; @echo $@: F=$(F)
|
|
a: b
|
|
b: c
|
|
',
|
|
'', "c: F=a\nb: F=b\na: F=a\n");
|
|
|
|
# 2: Again, but this time we start with "b" so "a"'s variable is not in scope
|
|
&run_make_test(undef, 'b', "c: F=g\nb: F=b\n");
|
|
|
|
# 3: Verification with pattern-specific variables
|
|
&run_make_test('
|
|
t.a:
|
|
|
|
F1 = g
|
|
F2 = g
|
|
%.a: private F1 = a
|
|
%.a: F2 = a
|
|
|
|
t.a t.b: ; @echo $@: F1=$(F1) / F2=$(F2)
|
|
t.a: t.b
|
|
',
|
|
'', "t.b: F1=g / F2=a\nt.a: F1=a / F2=a\n");
|
|
|
|
# 4: Test private global variables
|
|
&run_make_test('
|
|
a:
|
|
private F = g
|
|
G := $(F)
|
|
a:
|
|
b: F = b
|
|
|
|
a b: ; @echo $@: F=$(F) / G=$(G)
|
|
a: b
|
|
',
|
|
'', "b: F=b / G=g\na: F= / G=g\n");
|
|
|
|
# Exported private global variables
|
|
run_make_test('
|
|
private export F = global
|
|
$(info $(shell #HELPER# env F))
|
|
a: b
|
|
b: export F=b
|
|
a b: ; @#HELPER# raw $@ env F
|
|
',
|
|
'', "F=global\nbF=b\naF=<unset>");
|
|
|
|
|
|
# 5: Multiple conditions on the same variable. Test export.
|
|
delete $ENV{'_X'};
|
|
&run_make_test('
|
|
_X = x
|
|
a: export override private _X = a
|
|
a: ; @echo _X=$(_X) / _X=$$_X
|
|
',
|
|
'', "_X=a / _X=a");
|
|
|
|
# 6: Test override.
|
|
&run_make_test(undef, '_X=c', "_X=a / _X=a\n");
|
|
|
|
# 7: Ensure keywords still work as targets
|
|
&run_make_test('
|
|
a: export override private foo bar
|
|
foo bar export override private: ; @echo $@
|
|
',
|
|
'', "export\noverride\nprivate\nfoo\nbar\n");
|
|
|
|
# 8: Ensure keywords still work as variables
|
|
&run_make_test('
|
|
private = g
|
|
a: private = a
|
|
a: b
|
|
a b: ; @echo $@=$(private)
|
|
',
|
|
'', "b=a\na=a\n");
|
|
|
|
# 9: make sure private suppresses inheritance
|
|
run_make_test(q!
|
|
DEFS = FOO
|
|
all: bar1
|
|
bar1: private DEFS += 1
|
|
bar3: private DEFS += 3
|
|
bar1: bar2
|
|
bar2: bar3
|
|
bar1 bar2 bar3: ; @echo '$@: $(DEFS)'
|
|
!,
|
|
'', "bar3: FOO 3\nbar2: FOO\nbar1: FOO 1\n");
|
|
|
|
# 10: Test append with pattern-specific variables and private
|
|
|
|
run_make_test(q!
|
|
IA = global
|
|
PA = global
|
|
PS = global
|
|
S = global
|
|
PS = global
|
|
SV = global
|
|
b%: IA += b%
|
|
b%: private PA += b%
|
|
b%: private PS = b%
|
|
bar: all
|
|
bar: IA += bar
|
|
bar: private PA += bar
|
|
bar: private PS = bar
|
|
a%: IA += a%
|
|
a%: private PA += a%
|
|
a%: private PS = a%
|
|
all: IA += all
|
|
all: private PA += all
|
|
all: private PS = all
|
|
|
|
bar all: ; @echo '$@: IA=$(IA)'; echo '$@: PA=$(PA)'; echo '$@: PS=$(PS)'
|
|
!,
|
|
'', "all: IA=global b% bar a% all
|
|
all: PA=global a% all
|
|
all: PS=all
|
|
bar: IA=global b% bar
|
|
bar: PA=global b% bar
|
|
bar: PS=bar\n");
|
|
|
|
# SV 61463: Private parent variables should not be exported
|
|
|
|
run_make_test(q!
|
|
a: private export FOO := a
|
|
a: b
|
|
b: ; @#HELPER# env FOO
|
|
!,
|
|
'', 'FOO=<unset>');
|
|
|
|
run_make_test(q!
|
|
a: private export FOO := a
|
|
a: b
|
|
b: FOO := b
|
|
b: ; @#HELPER# env FOO
|
|
!,
|
|
'', 'FOO=<unset>');
|
|
|
|
run_make_test(q!
|
|
export FOO := g
|
|
a: private export FOO := a
|
|
a: b
|
|
b:
|
|
b: ; @#HELPER# env FOO
|
|
!,
|
|
'', 'FOO=g');
|
|
|
|
run_make_test(q!
|
|
export FOO := g
|
|
a: private export FOO := a
|
|
a: b
|
|
b: FOO := b
|
|
b: ; @#HELPER# env FOO
|
|
!,
|
|
'', 'FOO=b');
|
|
|
|
run_make_test(q!
|
|
private export FOO := g
|
|
a: private export FOO := a
|
|
a: b
|
|
b: FOO := b
|
|
b: ; @#HELPER# env FOO
|
|
!,
|
|
'', 'FOO=<unset>');
|
|
|
|
1;
|