| # -*-perl-*- |
| |
| $description = "\ |
| The following test creates a makefile to test the presence |
| of multiple rules for one target. One file can be the |
| target of several rules if at most one rule has commands; |
| the other rules can only have dependencies."; |
| |
| $details = "\ |
| The makefile created in this test contains two hardcoded rules |
| for foo.o and bar.o. It then gives another multiple target rule |
| with the same names as above but adding more dependencies. |
| Additionally, another variable extradeps is listed as a |
| dependency but is defined to be null. It can however be defined |
| on the make command line as extradeps=extra.h which adds yet |
| another dependency to the targets."; |
| |
| open(MAKEFILE,"> $makefile"); |
| |
| # The Contents of the MAKEFILE ... |
| |
| print MAKEFILE <<EOF; |
| objects = foo.o bar.o |
| foo.o : defs.h |
| bar.o : defs.h test.h |
| extradeps = |
| \$(objects) : config.h \$(extradeps) |
| \t\@echo EXTRA EXTRA |
| EOF |
| |
| # END of Contents of MAKEFILE |
| |
| close(MAKEFILE); |
| |
| &touch("defs.h","test.h","config.h"); |
| |
| if ($vos) |
| { |
| $error_code = 3307; |
| } |
| else |
| { |
| $error_code = 512; |
| } |
| |
| &run_make_with_options($makefile, |
| "extradeps=extra.h", |
| &get_logfile, |
| $error_code); |
| |
| # Create the answer to what should be produced by this Makefile |
| $answer = "$make_name: *** No rule to make target 'extra.h', needed by 'foo.o'. Stop.\n"; |
| |
| &compare_output($answer,&get_logfile(1)); |
| |
| |
| # TEST #2 |
| # ------- |
| |
| &touch("extra.h"); |
| |
| &run_make_with_options($makefile, |
| "extradeps=extra.h", |
| &get_logfile, |
| 0); |
| |
| # Create the answer to what should be produced by this Makefile |
| $answer = "EXTRA EXTRA\n"; |
| |
| &compare_output($answer,&get_logfile(1)); |
| |
| unlink("defs.h","test.h","config.h","extra.h"); |
| |
| # sv 62650. |
| # Test the message that make prints when a file found by directory search |
| # is preferred over the local one. |
| run_make_test(q! |
| vpath hello.c src |
| all: hello.c; $(info $@ from $^) |
| hello.c: ; $(info 1 $@) |
| src/hello.c: ; $(info 2 $@) |
| !, '', |
| "#MAKEFILE#:4: recipe was specified for file 'hello.c' at #MAKEFILE#:4, |
| #MAKEFILE#:4: but 'hello.c' is now considered the same file as 'src/hello.c' |
| #MAKEFILE#:4: recipe for 'hello.c' will be ignored in favor of the one for 'src/hello.c' |
| 2 src/hello.c |
| all from src/hello.c |
| #MAKE#: 'all' is up to date.\n"); |
| |
| 1; |