# -*-perl-*- $description = "The following test creates a makefile to test the -I option."; $details = "\ This test tests the -I option by including a filename in another directory and giving make that directory name under -I in the command line. Without this option, the make would fail to find the included file. It also checks to make sure that the -I option gets passed to recursive makes."; use File::Spec; # Create a directory and put a makefile in it. # We can't put it in the current directory since that's automatically searched # anyway. my $subdir = 'idir'; mkdir($subdir, 0777); my $included = 'ifile.mk'; my $ipath = File::Spec->catfile($subdir, $included); create_file($ipath, " ANOTHER: \t\@echo This is another included makefile recurse: \t\@\$(MAKE) ANOTHER -f \$(main_makefile)\n"); my $nosuch = "#MAKEFILE#:5: $included: $ERR_no_such_file #MAKE#: *** No rule to make target '$included'. Stop.\n"; # Verify that we get an error if we don't have -I run_make_test(qq! main_makefile := \$(firstword \$(MAKEFILE_LIST)) all: \t\@echo There should be no errors for this makefile include $included !, '', $nosuch, 512); # Check basic -I works run_make_test(undef, "-I $subdir all", "There should be no errors for this makefile\n"); # Check that the included target works run_make_test(undef, "-I $subdir ANOTHER", "This is another included makefile\n"); # Check that -I is passed down through MAKEFLAGS run_make_test(undef, "-I $subdir recurse", "#MAKE#[1]: Entering directory '#PWD#' This is another included makefile #MAKE#[1]: Leaving directory '#PWD#'\n"); # Verify that we get an error if we add -I- to delete previous includes run_make_test(undef, "-I $subdir -I- all", $nosuch, 512); # Make another directory with the same name and make sure the right one is # chosen if -I- stops the path. mkdir('idir2', 0777); my $ipath2 = File::Spec->catfile('idir2', $included); create_file($ipath2, "This is a bad makefile!!\n"); run_make_test(undef, "-I idir2 -I $subdir ANOTHER", "$included:1: *** missing separator. Stop.\n", 512); run_make_test(undef, "-I idir2 -I - -I $subdir ANOTHER", "This is another included makefile\n"); # Check that -I- is passed down through MAKEFLAGS run_make_test(undef, "-I idir2 -I - -I $subdir recurse", "#MAKE#[1]: Entering directory '#PWD#' This is another included makefile #MAKE#[1]: Leaving directory '#PWD#'\n"); unlink($ipath2); rmdir('idir2'); # The only way to check if -I- voids included directories is to see if a file # exists in one and try to include it. We very likely can't add our own files # to the default directories since they're probably write-protected. This # won't work if none of the default directories contain any files :-/ create_file('defaultdirs.mk', "\$(info \$(.INCLUDE_DIRS))\nall:;\@:\n"); my $cmd = subst_make_string("#MAKEPATH# -f defaultdirs.mk"); my @dirs = `$cmd`; my $dirs = $dirs[0]; chomp $dirs; unlink('defaultdirs.mk'); my $fn = undef; foreach my $dn (split ' ', $dirs) { # On Windows the default is "." which is bogus! if ($dn ne '.') { my @files = glob(File::Spec->catfile($dn, "*")); if (@files) { (undef, undef, $fn) = File::Spec->splitpath($files[0]); last; } } } if ($fn) { run_make_test(" all:; include $fn ", '-I-', "#MAKEFILE#:3: $fn: $ERR_no_such_file #MAKE#: *** No rule to make target '$fn'. Stop.\n", 512); } unlink($ipath); rmdir($subdir); 1;