Training courses

Kernel and Embedded Linux

Bootlin training courses

Embedded Linux, kernel,
Yocto Project, Buildroot, real-time,
graphics, boot time, debugging...

Bootlin logo

Elixir Cross Referencer

#                                                                    -*-perl-*-
$description = "Test target-specific variable settings.";

$details = "\
Create a makefile containing various flavors of target-specific variable
values, override and non-override, and using various variable expansion
rules, semicolon interference, etc.";

open(MAKEFILE,"> $makefile");

print MAKEFILE <<'EOF';
SHELL = /bin/sh
export FOO = foo
export BAR = bar
one: override FOO = one
one two: ; @echo $(FOO) $(BAR)
two: BAR = two
three: ; BAR=1000
	@echo $(FOO) $(BAR)
# Some things that shouldn't be target vars
funk : override
funk : override adelic
adelic override : ; echo $@
# Test per-target recursive variables
four:FOO=x
four:VAR$(FOO)=ok
four: ; @echo '$(FOO) $(VAR$(FOO)) $(VAR) $(VARx)'
five:FOO=x
five six : VAR$(FOO)=good
five six: ;@echo '$(FOO) $(VAR$(FOO)) $(VAR) $(VARx) $(VARfoo)'
# Test per-target variable inheritance
seven: eight
seven eight: ; @echo $@: $(FOO) $(BAR)
seven: BAR = seven
seven: FOO = seven
eight: BAR = eight
# Test the export keyword with per-target variables
nine: ; @echo $(FOO) $(BAR) $$FOO $$BAR
nine: FOO = wallace
nine-a: export BAZ = baz
nine-a: ; @echo $$BAZ
# Test = escaping
EQ = =
ten: one\=two
ten: one \= two
ten one$(EQ)two $(EQ):;@echo $@
.PHONY: one two three four five six seven eight nine ten $(EQ) one$(EQ)two
# Test target-specific vars with pattern/suffix rules
QVAR = qvar
RVAR = =
%.q : ; @echo $(QVAR) $(RVAR)
foo.q : RVAR += rvar
# Target-specific vars with multiple LHS pattern rules
%.r %.s %.t: ; @echo $(QVAR) $(RVAR) $(SVAR) $(TVAR)
foo.r : RVAR += rvar
foo.t : TVAR := $(QVAR)
EOF

close(MAKEFILE);

# TEST #1

&run_make_with_options($makefile, "one two three", &get_logfile);
$answer = "one bar\nfoo two\nBAR=1000\nfoo bar\n";
&compare_output($answer,&get_logfile(1));

# TEST #2

&run_make_with_options($makefile, "one two FOO=1 BAR=2", &get_logfile);
$answer = "one 2\n1 2\n";
&compare_output($answer,&get_logfile(1));

# TEST #3

&run_make_with_options($makefile, "four", &get_logfile);
$answer = "x ok  ok\n";
&compare_output($answer,&get_logfile(1));

# TEST #4

&run_make_with_options($makefile, "seven", &get_logfile);
$answer = "eight: seven eight\nseven: seven seven\n";
&compare_output($answer,&get_logfile(1));

# TEST #5

&run_make_with_options($makefile, "nine", &get_logfile);
$answer = "wallace bar wallace bar\n";
&compare_output($answer,&get_logfile(1));

# TEST #5-a

&run_make_with_options($makefile, "nine-a", &get_logfile);
$answer = "baz\n";
&compare_output($answer,&get_logfile(1));

# TEST #6

&run_make_with_options($makefile, "ten", &get_logfile);
$answer = "one=two\none bar\n=\nfoo two\nten\n";
&compare_output($answer,&get_logfile(1));

# TEST #6

&run_make_with_options($makefile, "foo.q bar.q", &get_logfile);
$answer = "qvar = rvar\nqvar =\n";
&compare_output($answer,&get_logfile(1));

# TEST #7

&run_make_with_options($makefile, "foo.t bar.s", &get_logfile);
$answer = "qvar = qvar\nqvar =\n";
&compare_output($answer,&get_logfile(1));


# TEST #8
# For PR/1378: Target-specific vars don't inherit correctly

$makefile2 = &get_tmpfile;

open(MAKEFILE,"> $makefile2");
print MAKEFILE <<'EOF';
foo: FOO = foo
bar: BAR = bar
foo: bar
bar: baz
baz: ; @echo $(FOO) $(BAR)
EOF
close(MAKEFILE);

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

# TEST #9
# For PR/1380: Using += assignment in target-specific variables sometimes fails
# Also PR/1831

$makefile3 = &get_tmpfile;

open(MAKEFILE,"> $makefile3");
print MAKEFILE <<'EOF';
.PHONY: all one
all: FOO += baz
all: one; @echo $(FOO)

FOO = bar

one: FOO += biz
one: FOO += boz
one: ; @echo $(FOO)
EOF
close(MAKEFILE);

&run_make_with_options("$makefile3", "", &get_logfile);
$answer = "bar baz biz boz\nbar baz\n";
&compare_output($answer, &get_logfile(1));

# Test #10

&run_make_with_options("$makefile3", "one", &get_logfile);
$answer = "bar biz boz\n";
&compare_output($answer, &get_logfile(1));

# Test #11
# PR/1709: Test semicolons in target-specific variable values

$makefile4 = &get_tmpfile;

open(MAKEFILE, "> $makefile4");
print MAKEFILE <<'EOF';
foo : FOO = ; ok
foo : ; @echo '$(FOO)'
EOF
close(MAKEFILE);

&run_make_with_options("$makefile4", "", &get_logfile);
$answer = "; ok\n";
&compare_output($answer, &get_logfile(1));

# Test #12
# PR/2020: More hassles with += target-specific vars.  I _really_ think
# I nailed it this time :-/.

$makefile5 = &get_tmpfile;

open(MAKEFILE, "> $makefile5");
print MAKEFILE <<'EOF';
.PHONY: a

BLAH := foo
COMMAND = echo $(BLAH)

a: ; @$(COMMAND)

a: BLAH := bar
a: COMMAND += snafu $(BLAH)
EOF
close(MAKEFILE);

&run_make_with_options("$makefile5", "", &get_logfile);
$answer = "bar snafu bar\n";
&compare_output($answer, &get_logfile(1));

# Test #13
# Test double-colon rules with target-specific variable values

$makefile6 = &get_tmpfile;

open(MAKEFILE, "> $makefile6");
print MAKEFILE <<'EOF';
W = bad
X = bad
foo: W = ok
foo:: ; @echo $(W) $(X) $(Y) $(Z)
foo:: ; @echo $(W) $(X) $(Y) $(Z)
foo: X = ok

Y = foo
bar: foo
bar: Y = bar

Z = nopat
ifdef PATTERN
  fo% : Z = pat
endif

EOF
close(MAKEFILE);

&run_make_with_options("$makefile6", "foo", &get_logfile);
$answer = "ok ok foo nopat\nok ok foo nopat\n";
&compare_output($answer, &get_logfile(1));

# Test #14
# Test double-colon rules with target-specific variable values and
# inheritance

&run_make_with_options("$makefile6", "bar", &get_logfile);
$answer = "ok ok bar nopat\nok ok bar nopat\n";
&compare_output($answer, &get_logfile(1));

# Test #15
# Test double-colon rules with pattern-specific variable values

&run_make_with_options("$makefile6", "foo PATTERN=yes", &get_logfile);
$answer = "ok ok foo pat\nok ok foo pat\n";
&compare_output($answer, &get_logfile(1));


# Test #16
# Test target-specific variables with very long command line
# (> make default buffer length)

$makefile7 = &get_tmpfile;

open(MAKEFILE, "> $makefile7");
print MAKEFILE <<'EOF';
base_metals_fmd_reports.sun5 base_metals_fmd_reports CreateRealPositions        CreateMarginFunds deals_changed_since : BUILD_OBJ=$(shell if [ -f               "build_information.generate" ]; then echo "$(OBJ_DIR)/build_information.o"; else echo "no build information"; fi  )

deals_changed_since: ; @echo $(BUILD_OBJ)

EOF
close(MAKEFILE);

&run_make_with_options("$makefile7", '', &get_logfile);
$answer = "no build information\n";
&compare_output($answer, &get_logfile(1));

# TEST #17

# Test a merge of set_lists for files, where one list is much longer
# than the other.  See Savannah bug #15757.

mkdir('t1', 0777);
touch('t1/rules.mk');

run_make_test('
VPATH = t1
include rules.mk
.PHONY: all
all: foo.x
foo.x : rules.mk ; @echo MYVAR=$(MYVAR) FOOVAR=$(FOOVAR) ALLVAR=$(ALLVAR)
all: ALLVAR = xxx
foo.x: FOOVAR = bar
rules.mk : MYVAR = foo
.INTERMEDIATE: foo.x rules.mk
',
              '-I t1',
              'MYVAR= FOOVAR=bar ALLVAR=xxx');

rmfiles('t1/rules.mk');
rmdir('t1');

# TEST #18

# Test appending to a simple variable containing a "$": avoid a
# double-expansion.  See Savannah bug #15913.

run_make_test("
VAR := \$\$FOO
foo: VAR += BAR
foo: ; \@echo '\$(VAR)'",
              '',
              '$FOO BAR');

1;