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 make -W (what if) option.\n";

# Basic build

run_make_test('
a.x: b.x
a.x b.x: ; echo >> $@
',
              '', "echo >> b.x\necho >> a.x");

# Run it again: nothing should happen

run_make_test(undef, '', "#MAKE#: `a.x' is up to date.");

# Now run it with -W b.x: should rebuild a.x

run_make_test(undef, '-W b.x', 'echo >> a.x');

# Put the timestamp for a.x into the future; it should still be remade.

utouch(1000, 'a.x');
run_make_test(undef, '', "#MAKE#: `a.x' is up to date.");
run_make_test(undef, '-W b.x', 'echo >> a.x');

# Clean up

rmfiles('a.x', 'b.x');

# Test -W with the re-exec feature: we don't want to re-exec forever
# Savannah bug # 7566

# First set it up with a normal build

run_make_test('
all: baz.x ; @:
include foo.x
foo.x: bar.x
	@echo "\$$(info restarts=\$$(MAKE_RESTARTS))" > $@
	@echo "touch $@"
bar.x: ; echo >> $@
baz.x: bar.x ; @echo "touch $@"
',
              '', '#MAKEFILE#:3: foo.x: No such file or directory
echo >> bar.x
touch foo.x
restarts=1
touch baz.x');

# Now run with -W bar.x

# Tweak foo.x's timestamp so the update will change it.
&utouch(1000, 'foo.x');

run_make_test(undef, '-W bar.x', "restarts=\ntouch foo.x\nrestarts=1\ntouch baz.x");

rmfiles('foo.x', 'bar.x');

# Test -W on vpath-found files: it should take effect.
# Savannah bug # 15341

mkdir('x-dir', 0777);
utouch(-20, 'x-dir/x');
touch('y');

run_make_test('
y: x ; @echo cp $< $@
',
              '-W x-dir/x VPATH=x-dir',
              'cp x-dir/x y');

# Make sure ./ stripping doesn't interfere with the match.

run_make_test('
y: x ; @echo cp $< $@
',
              '-W ./x-dir/x VPATH=x-dir',
              'cp x-dir/x y');

run_make_test(undef,
              '-W x-dir/x VPATH=./x-dir',
              'cp ./x-dir/x y');

unlink(qw(y x-dir/x));
rmdir('x-dir');

1;