#                                                                    -*-perl-*-

$description = "Test suffix rules.";

$details = "";

# TEST #0: Clear all suffixes

touch('foo.c');

run_make_test(q!
.SUFFIXES:
all: foo.o ; @echo $@ $<
!,
              '', "#MAKE#: *** No rule to make target 'foo.o', needed by 'all'.  Stop.\n", 512);

unlink('foo.c');

# Test #1: Add a simple suffix rule

touch('foo.baz');

run_make_test(q!
.SUFFIXES: .biz .baz

.baz.biz: ; @echo make $@
!,
              'foo.biz', "make foo.biz\n");

unlink('foo.baz');

# Test #2: Make sure the defaults still work

touch('foo.c');

run_make_test(undef, 'foo.o COMPILE.c=@echo OUTPUT_OPTION=', "foo.c\n");

unlink('foo.c');

# Test #3: Replacing all suffixes

touch('foo.baz');

run_make_test(q!
.SUFFIXES:
.SUFFIXES: .biz .baz

.baz.biz: ; @echo make $@
!,
              'foo.biz', "make foo.biz\n");

unlink('foo.baz');

# SV 40657: Test #4: "Suffix rules" with deps are normal rules

my $prewarn = 'warning: ignoring prerequisites on suffix rule definition';

touch('foo.bar');

run_make_test(q!
.SUFFIXES:
.SUFFIXES: .biz .baz

$X.POSIX:

.baz.biz: foo.bar ; @echo make $@ from $<
!,
              'X=1 .baz.biz', "#MAKEFILE#:7: $prewarn\nmake .baz.biz from foo.bar\n");

# SV 40657: Test #5: In POSIX mode we don't get a warning

run_make_test(undef, 'X= .baz.biz', "make .baz.biz from foo.bar\n");

unlink('foo.bar');

# SV 40657: Test #6: In POSIX mode, no pattern rules should be created

utouch(-20, 'foo.baz');

run_make_test(undef,
              'X= foo.biz', "#MAKE#: *** No rule to make target 'foo.biz'.  Stop.\n", 512);

# SV 40657: Test #7: In Non-POSIX mode, a pattern rule is created

run_make_test(undef,
              'X=1 foo.biz', "#MAKEFILE#:7: $prewarn\nmake foo.biz from foo.baz\n");

# SV 40657: Test #8: ... but any prerequisites are ignored

utouch(-10, 'foo.biz');
touch('foo.bar');

run_make_test(undef,
              'X=1 foo.biz', "#MAKEFILE#:7: $prewarn\n#MAKE#: 'foo.biz' is up to date.\n");

unlink('foo.baz', 'foo.biz', 'foo.bar');


touch('hello.c');
unlink('hello.o');

# sv 63821.
# Default suffix rule .c.o.

run_make_test('all: hello.o', 'COMPILE.c=@echo OUTPUT_OPTION=', 'hello.c');

# User defined rules beat built-in rules.

run_make_test(q!
all: hello.o
.c.o:; $(info $@ user defined .c.o rule)
!, '', "hello.o user defined .c.o rule\n#MAKE#: Nothing to be done for 'all'.\n");

# sv 63821.
# The same as above, but suffixes are cleared.

run_make_test(q!
all: hello.o
.SUFFIXES:
.c.o:; $(info $@ user defined .c.o rule)
!, '', "#MAKE#: *** No rule to make target 'hello.o', needed by 'all'.  Stop.\n", 512);

# sv 63821.
# Suffixes are cleared and defined in the makefile.

run_make_test(q!
all: hello.o
.SUFFIXES:
.SUFFIXES: .c .o
.c.o:; $(info $@ user defined .c.o rule)
!, '', "hello.o user defined .c.o rule\n#MAKE#: Nothing to be done for 'all'.\n");

# sv 63821.
# When built-in rules are disabled, but certain suffixes are added to
# .SUFFIXES, make should exit with the 'No rule...' error message.

run_make_test(q!
.SUFFIXES: .c .o
all: hello.o
!, '-r', "#MAKE#: *** No rule to make target 'hello.o', needed by 'all'.  Stop.\n", 512);

# sv 63821.
# Same as above, but this time built-in rules are disabled inside the makefile.

run_make_test(q!
MAKEFLAGS += -r
.SUFFIXES: .c .o
all: hello.o
!, '', "#MAKE#: *** No rule to make target 'hello.o', needed by 'all'.  Stop.\n", 512);

# sv 63821.
# Same as above, but this time there is a rule.

run_make_test(q!
all: hello.o
MAKEFLAGS += -r
.SUFFIXES: .c .o
.c.o:; $(info $@ user defined .c.o rule)
!, '', "hello.o user defined .c.o rule\n#MAKE#: Nothing to be done for 'all'.\n");

unlink('hello.c', 'hello.o');

# Complete
1;
