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 second expansion in ordinary rules.";

$details = "";

use Cwd;

$dir = cwd;
$dir =~ s,.*/([^/]+)$,../$1,;


# Test #1: automatic variables.
#
run_make_test('
.SECONDEXPANSION:
.DEFAULT: ; @echo $@

foo.a: bar baz

foo.a: biz | buz

foo.%: 1.$$@ \
       2.$$< \
       $$(addprefix 3.,$$^) \
       $$(addprefix 4.,$$+) \
       5.$$| \
       6.$$*
	@:

1.foo.a \
2.bar \
3.bar \
3.baz \
3.biz \
4.bar \
4.baz \
4.biz \
5.buz \
6.a:
	@echo $@

',
'',
'1.foo.a
2.bar
3.bar
3.baz
3.biz
4.bar
4.baz
4.biz
5.buz
6.a
bar
baz
biz
buz
');


# Test #2: target/pattern -specific variables.
#
run_make_test('
.SECONDEXPANSION:
foo.x:

foo.%: $$(%_a) $$(%_b) bar
	@:

foo.x: x_a := bar

%.x: x_b := baz

bar baz: ; @echo $@

',
'',
'bar
baz
');


# Test #3: order of prerequisites.
#
run_make_test('
.SECONDEXPANSION:
.DEFAULT: ; @echo $@

all: foo bar baz


# Subtest #1
#
%oo: %oo.1; @:

foo: foo.2

foo: foo.3

foo.1: ; @echo $@


# Subtest #2
#
bar: bar.2

%ar: %ar.1; @:

bar: bar.3

bar.1: ; @echo $@


# Subtest #3
#
baz: baz.1

baz: baz.2

%az: ; @:

',
'',
'foo.1
foo.2
foo.3
bar.1
bar.2
bar.3
baz.1
baz.2
');


# Test #4: stem splitting logic.
#
run_make_test('
.SECONDEXPANSION:
$(dir)/tmp/bar.o:

$(dir)/tmp/foo/bar.c: ; @echo $@
$(dir)/tmp/bar/bar.c: ; @echo $@
foo.h: ; @echo $@

%.o: $$(addsuffix /%.c,foo bar) foo.h
	@echo $@: {$<} $^

',
"dir=$dir",
"$dir/tmp/foo/bar.c
$dir/tmp/bar/bar.c
foo.h
$dir/tmp/bar.o: {$dir/tmp/foo/bar.c} $dir/tmp/foo/bar.c $dir/tmp/bar/bar.c foo.h
");


# Test #5: stem splitting logic and order-only prerequisites.
#
run_make_test('
.SECONDEXPANSION:
$(dir)/tmp/foo.o: $(dir)/tmp/foo.c
$(dir)/tmp/foo.c: ; @echo $@
bar.h: ; @echo $@

%.o: %.c|bar.h
	@echo $@: {$<} {$|} $^

',
"dir=$dir",
"$dir/tmp/foo.c
bar.h
$dir/tmp/foo.o: {$dir/tmp/foo.c} {bar.h} $dir/tmp/foo.c
");


# Test #6: lack of implicit prerequisites.
#
run_make_test('
.SECONDEXPANSION:
foo.o: foo.c
foo.c: ; @echo $@

%.o:
	@echo $@: {$<} $^

',
'',
'foo.c
foo.o: {foo.c} foo.c
');

# Test #7: Test stem from the middle of the name.
#
run_make_test('
.SECONDEXPANSION:
foobarbaz:

foo%baz: % $$*.1
	@echo $*

bar bar.1:
	@echo $@

',
'',
'bar
bar.1
bar
');

# Test #8: Make sure stem triple-expansion does not happen.
#
run_make_test('
.SECONDEXPANSION:
foo$$bar:

f%r: % $$*.1
	@echo \'$*\'

oo$$ba oo$$ba.1:
	@echo \'$@\'

',
'',
'oo$ba
oo$ba.1
oo$ba
');


# This tells the test driver that the perl test script executed properly.
1;