| # -*-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: "Suffix rules" with deps are normal rules |
| |
| my $prewarn = 'warning: ignoring prerequisites on suffix rule definition'; |
| |
| touch('foo.bar'); |
| |
| # Verify warnings for single-suffix rules |
| |
| run_make_test(q! |
| .SUFFIXES: |
| .SUFFIXES: .baz |
| |
| .baz: foo.bar ; @echo make $@ from $< |
| |
| $X.POSIX: |
| !, |
| 'X=1 .baz', "#MAKEFILE#:5: $prewarn\nmake .baz from foo.bar\n"); |
| |
| # In POSIX mode we don't get a warning |
| |
| run_make_test(undef, 'X= .baz', "make .baz from foo.bar\n"); |
| |
| # Test double-suffix rules |
| |
| 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: 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: 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: 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: ... 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'); |
| |
| # sv 65324. |
| # Crash in disable_builtins. |
| run_make_test(q! |
| all:; |
| !, '-r MAKEFLAGS=', "#MAKE#: 'all' is up to date.\n"); |
| |
| |
| # Complete |
| 1; |