| # -*-perl-*- | |
| $description = "The following test tests that if you specify greater \n" | |
| ."than one '-f makefilename' on the command line, \n" | |
| ."that make concatenates them. This test creates three \n" | |
| ."makefiles and specifies all of them with the -f option \n" | |
| ."on the command line. To make sure they were concatenated, \n" | |
| ."we then call make with the rules from the concatenated \n" | |
| ."makefiles one at a time. Finally, it calls all three \n" | |
| ."rules in one call to make and checks that the output\n" | |
| ."is in the correct order."; | |
| $makefile2 = &get_tmpfile; | |
| $makefile3 = &get_tmpfile; | |
| open(MAKEFILE,"> $makefile"); | |
| # The Contents of the MAKEFILE ... | |
| print MAKEFILE "all: \n"; | |
| print MAKEFILE "\t\@echo This is the output from the original makefile\n"; | |
| # END of Contents of MAKEFILE | |
| close(MAKEFILE); | |
| # Create a second makefile | |
| open(MAKEFILE,"> $makefile2"); | |
| print MAKEFILE "TWO: \n"; | |
| print MAKEFILE "\t\@echo This is the output from makefile 2\n"; | |
| close(MAKEFILE); | |
| # Create a third makefile | |
| open(MAKEFILE,"> $makefile3"); | |
| print MAKEFILE "THREE: \n"; | |
| print MAKEFILE "\t\@echo This is the output from makefile 3\n"; | |
| close(MAKEFILE); | |
| # Create the answer to what should be produced by this Makefile | |
| $answer = "This is the output from the original makefile\n"; | |
| # Run make to catch the default rule | |
| &run_make_with_options($makefile,"-f $makefile2 -f $makefile3",&get_logfile,0); | |
| &compare_output($answer,&get_logfile(1)); | |
| # Run Make again with the rule from the second makefile: TWO | |
| $answer = "This is the output from makefile 2\n"; | |
| &run_make_with_options($makefile,"-f $makefile2 -f $makefile3 TWO",&get_logfile,0); | |
| &compare_output($answer,&get_logfile(1)); | |
| # Run Make again with the rule from the third makefile: THREE | |
| $answer = "This is the output from makefile 3\n"; | |
| &run_make_with_options($makefile, | |
| "-f $makefile2 -f $makefile3 THREE", | |
| &get_logfile, | |
| 0); | |
| &compare_output($answer,&get_logfile(1)); | |
| # Run Make again with ALL three rules in the order 2 1 3 to make sure | |
| # that all rules are executed in the proper order | |
| $answer = "This is the output from makefile 2\n"; | |
| $answer .= "This is the output from the original makefile\n"; | |
| $answer .= "This is the output from makefile 3\n"; | |
| &run_make_with_options($makefile, | |
| "-f $makefile2 -f $makefile3 TWO all THREE", | |
| &get_logfile, | |
| 0); | |
| &compare_output($answer,&get_logfile(1)); | |
| # sv 62118. | |
| # Validate all sorts of -f etc. options | |
| my $hello = 'hello.mk'; | |
| my $bye = 'bye.mk'; | |
| my $byesrc = 'bye.mk.src'; | |
| create_file($hello, 'all:; $(info hello, world) | |
| '); | |
| create_file($bye, 'def:; $(info bye, world) | |
| bye.mk: bye.mk.src; touch $@ | |
| bye.mk.src:; touch $@ | |
| '); | |
| # These invocations use the empty filename string so that the test framework | |
| # doesn't add any -f options on its own. | |
| # Incorrect order of options. -R follows -f. | |
| # Invocation of make is equivalent to | |
| # echo 'all:; $(info hello, world)' | make -f bye.mk -fR - all | |
| # There is bye.mk, but there is no 'R'. | |
| # make runs the recipes from bye.mk and prints the error about missing 'R'. | |
| # Ensure the newly created bye.src.mk is newer than bye.mk. | |
| &utouch(-600, $bye); | |
| run_make_test('', "-f$bye -fR - all", "#MAKE#: R: No such file or directory | |
| touch bye.mk.src | |
| touch bye.mk | |
| #MAKE#: *** No rule to make target 'R'. Stop. | |
| ", 512); | |
| my @opts; | |
| my $answer; | |
| # Test double -f-. | |
| @opts = ('-f- -f-', '-f - -f -', '-f- -f -', '-f - -f-', | |
| '-f- --file=-', '-f- --file -', '-f - --file=-', '-f - --file -', | |
| '-f- --makefile=-', '-f- --makefile -', | |
| '-f - --makefile=-', '-f - --makefile -', | |
| '--file=- --makefile=-', '--file=- --makefile -', | |
| '--file - --makefile=-', '--file - --makefile -'); | |
| for my $opt (@opts) { | |
| # We shouldn't need this; if the options are wrong then make shouldn't try | |
| # to read from stdin. | |
| close(STDIN); | |
| open(STDIN, "<", $hello) || die "$0: cannot open $hello for reading: $!"; | |
| run_make_test('', "-f$bye $opt", "#MAKE#: *** Makefile from standard input specified twice. Stop.\n", 512); | |
| } | |
| # -f is not followed by filename. | |
| @opts = ('-f', '--file', '--makefile'); | |
| $answer = "/requires an argument/"; | |
| for my $opt (@opts) { | |
| run_make_test('', $opt, $answer, 512); | |
| } | |
| # Test that make correctly parses all possible syntaxes to pipe make code to | |
| # the standard input. | |
| $answer = "touch bye.mk.src | |
| touch bye.mk | |
| hello, world | |
| #MAKE#: 'all' is up to date.\n"; | |
| @opts = ('-f- all', '-f - all', '-Rf- all', '-Rf - all', | |
| '--file=- all', '--file - all', | |
| '--makefile=- all', '--makefile - all'); | |
| for my $opt (@opts) { | |
| unlink($byesrc); | |
| close(STDIN); | |
| open(STDIN, "<", $hello) || die "$0: cannot open $hello for reading: $!"; | |
| # Ensure the newly created bye.src.mk is newer than bye.mk. | |
| &utouch(-600, $bye); | |
| run_make_test('', "-f$bye $opt", $answer); | |
| } | |
| # This close MUST come at the end of the test!! | |
| close(STDIN); | |
| unlink($hello, $bye, $byesrc); | |
| # This tells the test driver that the perl test script executed properly. | |
| 1; |