# -*-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); } close(STDIN); unlink($hello, $bye, $byesrc); # This tells the test driver that the perl test script executed properly. 1;