mirror of
https://github.com/mirror/make.git
synced 2025-01-16 07:10:13 +08:00
Refresh the test suite framework implementation.
Go through both run_make_tests.pl and test_driver.pl and slightly modernize the Perl and clean up indentation etc. Fix a number of warnings in the test scripts detected by running with -w. * tests/test_driver.pl: Move make error string detection out of the base test driver. (run_all_tests): Ensure that we always look for tests in the cwd. * tests/run_make_tests.pl: Use File::Spec for path manipulations. Correctly use setlocale() when detecting error strings. Get configuration from the config-flags.pm file not config.status. * tests/scripts/features/archives: Use new $cwddir variable. * tests/scripts/features/reinvoke: Add missing semicolon. * tests/scripts/features/vpath2: Avoid non-existent variable. * tests/scripts/functions/foreach: Escape variables. * tests/scripts/misc/bs-nl: Remove non-existing \v escape sequence. * tests/scripts/misc/general4: Use handy create_file(). * tests/scripts/options/dash-C: Use Cwd/$cwddir. * tests/scripts/options/dash-I: Use subst_make_string() and #PWD#. * tests/scripts/options/symlinks: Use File::Spec. * tests/scripts/targets/DEFAULT: Use create_file and run_make_test. * tests/scripts/variables/CURDIR: Use run_make_test. * tests/scripts/variables/automatic: Remove extraneous "\". * tests/scripts/vms/library: Remove extra "my" and extraneous "\".
This commit is contained in:
parent
1b976397e5
commit
414af96a50
@ -27,6 +27,21 @@
|
||||
# You should have received a copy of the GNU General Public License along with
|
||||
# this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Add the working directory to @INC and load the test driver
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin";
|
||||
|
||||
require "test_driver.pl";
|
||||
|
||||
use File::Spec::Functions qw(:DEFAULT splitdir splitpath catpath);
|
||||
|
||||
use Cwd;
|
||||
$cwdpath = cwd();
|
||||
($cwdvol, $cwddir, $_) = splitpath($cwdpath, 1);
|
||||
|
||||
# Some target systems might not have the POSIX module...
|
||||
$has_POSIX = eval { require "POSIX.pm" };
|
||||
|
||||
%FEATURES = ();
|
||||
|
||||
$valgrind = 0; # invoke make with valgrind
|
||||
@ -36,7 +51,12 @@ $massif_args = '--num-callers=15 --tool=massif --alloc-fn=xmalloc --alloc-fn=xca
|
||||
$pure_log = undef;
|
||||
|
||||
# The location of the GNU make source directory
|
||||
$srcdir = '';
|
||||
$srcdir = undef;
|
||||
$srcvol = undef;
|
||||
|
||||
# The location of the build directory
|
||||
$blddir = undef;
|
||||
$bldvol = undef;
|
||||
|
||||
$command_string = '';
|
||||
|
||||
@ -67,24 +87,71 @@ if ($^O eq 'VMS')
|
||||
$CMD_rmfile = 'delete_file -no_ask';
|
||||
}
|
||||
|
||||
use FindBin;
|
||||
use lib "$FindBin::Bin";
|
||||
|
||||
require "test_driver.pl";
|
||||
|
||||
%CONFIG_FLAGS = ();
|
||||
|
||||
my $statnm = "$FindBin::Bin/../config.status";
|
||||
if (open(my $fh, '<', $statnm)) {
|
||||
while (my $line = <$fh>) {
|
||||
$line =~ m/^[SD]\["([^\"]+)"\]=" *(.*)"/ and $CONFIG_FLAGS{$1} = $2;
|
||||
}
|
||||
} else {
|
||||
warn "Failed to open $statnm: $!";
|
||||
}
|
||||
# Find the strings that will be generated for various error codes.
|
||||
# We want them from the C locale regardless of our current locale.
|
||||
|
||||
# Some target systems might not have the POSIX module...
|
||||
$has_POSIX = eval { require "POSIX.pm" };
|
||||
$ERR_no_such_file = undef;
|
||||
$ERR_read_only_file = undef;
|
||||
$ERR_unreadable_file = undef;
|
||||
$ERR_noexe_file = undef;
|
||||
$ERR_exe_dir = undef;
|
||||
|
||||
{
|
||||
use locale;
|
||||
|
||||
my $loc = undef;
|
||||
if ($has_POSIX) {
|
||||
POSIX->import(qw(locale_h));
|
||||
# Windows has POSIX locale, but only LC_ALL not LC_MESSAGES
|
||||
$loc = POSIX::setlocale(&POSIX::LC_ALL);
|
||||
POSIX::setlocale(&POSIX::LC_ALL, 'C');
|
||||
}
|
||||
|
||||
if (open(my $F, '<', 'file.none')) {
|
||||
print "Opened non-existent file! Skipping related tests.\n";
|
||||
} else {
|
||||
$ERR_no_such_file = "$!";
|
||||
}
|
||||
|
||||
unlink('file.out');
|
||||
touch('file.out');
|
||||
|
||||
chmod(0444, 'file.out');
|
||||
if (open(my $F, '>', 'file.out')) {
|
||||
print "Opened read-only file! Skipping related tests.\n";
|
||||
close($F);
|
||||
} else {
|
||||
$ERR_read_only_file = "$!";
|
||||
}
|
||||
|
||||
$_ = `./file.out 2>/dev/null`;
|
||||
if ($? == 0) {
|
||||
print "Executed non-executable file! Skipping related tests.\n";
|
||||
} else {
|
||||
$ERR_nonexe_file = "$!";
|
||||
}
|
||||
|
||||
$_ = `./. 2>/dev/null`;
|
||||
if ($? == 0) {
|
||||
print "Executed directory! Skipping related tests.\n";
|
||||
} else {
|
||||
$ERR_exe_dir = "$!";
|
||||
}
|
||||
|
||||
chmod(0000, 'file.out');
|
||||
if (open(my $F, '<', 'file.out')) {
|
||||
print "Opened unreadable file! Skipping related tests.\n";
|
||||
close($F);
|
||||
} else {
|
||||
$ERR_unreadable_file = "$!";
|
||||
}
|
||||
|
||||
unlink('file.out') or die "Failed to delete file.out: $!\n";
|
||||
|
||||
$loc and POSIX::setlocale(&POSIX::LC_ALL, $loc);
|
||||
}
|
||||
|
||||
#$SIG{INT} = sub { print STDERR "Caught a signal!\n"; die @_; };
|
||||
|
||||
@ -103,7 +170,7 @@ sub valid_option
|
||||
|
||||
if ($option =~ /^-srcdir$/i) {
|
||||
$srcdir = shift @argv;
|
||||
if (! -f "$srcdir/src/gnumake.h") {
|
||||
if (! -f catfile($srcdir, 'src', 'gnumake.h')) {
|
||||
print "$option $srcdir: Not a valid GNU make source directory.\n";
|
||||
exit 0;
|
||||
}
|
||||
@ -155,7 +222,7 @@ sub subst_make_string
|
||||
s/#MAKEPATH#/$mkpath/g;
|
||||
s/#MAKE#/$make_name/g;
|
||||
s/#PERL#/$perl_name/g;
|
||||
s/#PWD#/$pwd/g;
|
||||
s/#PWD#/$cwdpath/g;
|
||||
return $_;
|
||||
}
|
||||
|
||||
@ -170,7 +237,7 @@ sub run_make_test
|
||||
|
||||
if (! defined $makestring) {
|
||||
defined $old_makefile
|
||||
|| die "run_make_test(undef) invoked before run_make_test('...')\n";
|
||||
or die "run_make_test(undef) invoked before run_make_test('...')\n";
|
||||
$makefile = $old_makefile;
|
||||
} else {
|
||||
if (! defined($makefile)) {
|
||||
@ -182,9 +249,9 @@ sub run_make_test
|
||||
$makestring = subst_make_string($makestring);
|
||||
|
||||
# Populate the makefile!
|
||||
open(MAKEFILE, "> $makefile") || die "Failed to open $makefile: $!\n";
|
||||
open(MAKEFILE, "> $makefile") or die "Failed to open $makefile: $!\n";
|
||||
print MAKEFILE $makestring;
|
||||
close(MAKEFILE) || die "Failed to write $makefile: $!\n";
|
||||
close(MAKEFILE) or die "Failed to write $makefile: $!\n";
|
||||
}
|
||||
|
||||
# Do the same processing on $answer as we did on $makestring.
|
||||
@ -317,8 +384,7 @@ sub run_make_with_options {
|
||||
# If we have a purify log, save it
|
||||
$tn = $pure_testname . ($num_of_logfiles ? ".$num_of_logfiles" : "");
|
||||
print("Renaming purify log file to $tn\n") if $debug;
|
||||
rename($pure_log, "$tn")
|
||||
|| die "Can't rename $log to $tn: $!\n";
|
||||
rename($pure_log, "$tn") or die "Can't rename $log to $tn: $!\n";
|
||||
++$purify_errors;
|
||||
} else {
|
||||
unlink($pure_log);
|
||||
@ -363,168 +429,220 @@ sub print_help
|
||||
"\tRun the test suite under valgrind's memcheck tool.",
|
||||
"\tChange the default valgrind args with the VALGRIND_ARGS env var.",
|
||||
"-massif",
|
||||
"\tRun the test suite under valgrind's massif toool.",
|
||||
"\tRun the test suite under valgrind's massif tool.",
|
||||
"\tChange the default valgrind args with the VALGRIND_ARGS env var."
|
||||
);
|
||||
}
|
||||
|
||||
sub get_this_pwd {
|
||||
if ($has_POSIX) {
|
||||
$__pwd = POSIX::getcwd();
|
||||
} elsif ($vos) {
|
||||
$__pwd = `++(current_dir)`;
|
||||
} else {
|
||||
# No idea... just try using pwd as a last resort.
|
||||
chop ($__pwd = `pwd`);
|
||||
}
|
||||
|
||||
return $__pwd;
|
||||
}
|
||||
|
||||
sub set_defaults
|
||||
{
|
||||
# $profile = 1;
|
||||
$testee = "GNU make";
|
||||
$make_path = "make";
|
||||
$tmpfilesuffix = "mk";
|
||||
$pwd = &get_this_pwd;
|
||||
# $profile = 1;
|
||||
$testee = "GNU make";
|
||||
$make_path = "make";
|
||||
$tmpfilesuffix = "mk";
|
||||
}
|
||||
|
||||
# This is no longer used: we import config-flags.pm instead
|
||||
# sub parse_status
|
||||
# {
|
||||
# if (open(my $fh, '<', "$_[0]/config.status")) {
|
||||
# while (my $line = <$fh>) {
|
||||
# $line =~ m/^[SD]\["([^\"]+)"\]=" *(.*)"/ and $CONFIG_FLAGS{$1} = $2;
|
||||
# }
|
||||
# return 1;
|
||||
# }
|
||||
# return 0;
|
||||
# }
|
||||
|
||||
sub find_prog
|
||||
{
|
||||
my $prog = $_[0];
|
||||
my ($v, $d, $f) = splitpath($prog);
|
||||
|
||||
# If there's no directory then we need to search the PATH
|
||||
if (! $d) {
|
||||
foreach my $e (path()) {
|
||||
$prog = catfile($e, $f);
|
||||
-x $prog or continue;
|
||||
($v, $d, $f) = splitpath($prog);
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
return ($v, $d, $f);
|
||||
}
|
||||
|
||||
sub set_more_defaults
|
||||
{
|
||||
local($string);
|
||||
local($index);
|
||||
local($string);
|
||||
local($index);
|
||||
|
||||
# On DOS/Windows system the filesystem apparently can't track
|
||||
# timestamps with second granularity (!!). Change the sleep time
|
||||
# needed to force a file to be considered "old".
|
||||
$wtime = $port_type eq 'UNIX' ? 1 : $port_type eq 'OS/2' ? 2 : 4;
|
||||
# Now that we have located make_path, locate the srcdir and blddir
|
||||
my ($mpv, $mpd, $mpf) = find_prog($make_path);
|
||||
|
||||
# Find the full pathname of Make. For DOS systems this is more
|
||||
# complicated, so we ask make itself.
|
||||
if ($osname eq 'VMS') {
|
||||
$port_type = 'VMS-DCL' unless defined $ENV{"SHELL"};
|
||||
# On VMS pre-setup make to be found with simply 'make'.
|
||||
$make_path = 'make';
|
||||
} else {
|
||||
create_file('make.mk', 'all:;$(info $(MAKE))');
|
||||
my $mk = `$make_path -sf make.mk`;
|
||||
unlink('make.mk');
|
||||
chop $mk;
|
||||
$mk or die "FATAL ERROR: Cannot determine the value of \$(MAKE)\n";
|
||||
$make_path = $mk;
|
||||
}
|
||||
# We have a make program so try to compute the blddir.
|
||||
if ($mpd) {
|
||||
my $f = catpath($mpv, catdir($mpd, 'tests'), 'config-flags.pm');
|
||||
if (-f $f) {
|
||||
$bldvol = $mpv;
|
||||
$blddir = $mpd;
|
||||
}
|
||||
}
|
||||
|
||||
# Ask make what shell to use
|
||||
create_file('shell.mk', 'all:;$(info $(SHELL))');
|
||||
$sh_name = `$make_path -sf shell.mk`;
|
||||
unlink('shell.mk');
|
||||
chop $sh_name;
|
||||
if (! $sh_name) {
|
||||
print "Cannot determine shell\n";
|
||||
$is_posix_sh = 0;
|
||||
} else {
|
||||
my $o = `$sh_name -c ': do nothing' 2>&1`;
|
||||
$is_posix_sh = $? == 0 && $o == '';
|
||||
}
|
||||
# If srcdir wasn't provided on the command line, try to find it.
|
||||
if (! $srcdir && $blddir) {
|
||||
# See if the blddir is the srcdir
|
||||
my $f = catpath($bldvol, catdir($blddir, 'src'), 'gnumake.h');
|
||||
if (-f $f) {
|
||||
$srcdir = $blddir;
|
||||
$srcvol = $bldvol;
|
||||
}
|
||||
}
|
||||
|
||||
$string = `$make_path -v`;
|
||||
$string =~ /^(GNU Make [^,\n]*)/ or die "$make_path is not GNU make. Version:\n$string";
|
||||
$testee_version = "$1\n";
|
||||
if (! $srcdir) {
|
||||
# Not found, see if our parent is the source dir
|
||||
my $f = catpath($cwdvol, catdir(updir(), 'src'), 'gnumake.h');
|
||||
if (-f $f) {
|
||||
$srcdir = updir();
|
||||
$srcvol = $cwdvol;
|
||||
}
|
||||
}
|
||||
|
||||
create_file('null.mk', '');
|
||||
# If we have srcdir but not blddir, set them equal
|
||||
if ($srcdir && !$blddir) {
|
||||
$blddir = $srcdir;
|
||||
$bldvol = $srcvol;
|
||||
}
|
||||
|
||||
my $redir = '2>&1';
|
||||
$redir = '' if os_name eq 'VMS';
|
||||
$string = `$make_path -f null.mk $redir`;
|
||||
if ($string =~ /(.*): \*\*\* No targets\. Stop\./) {
|
||||
$make_name = $1;
|
||||
}
|
||||
else {
|
||||
$make_path =~ /^(?:.*$pathsep)?(.+)$/;
|
||||
$make_name = $1;
|
||||
}
|
||||
# Load the config flags
|
||||
if (!$blddir) {
|
||||
warn "Cannot locate config-flags.pm (no blddir)\n";
|
||||
} else {
|
||||
my $f = catpath($bldvol, catdir($blddir, 'tests'), 'config-flags.pm');
|
||||
if (! -f $f) {
|
||||
warn "Cannot locate $f\n";
|
||||
} else {
|
||||
unshift(@INC, catpath($bldvol, catdir($blddir, 'tests'), ''));
|
||||
require "config-flags.pm";
|
||||
}
|
||||
}
|
||||
|
||||
# prepend pwd if this is a relative path (ie, does not
|
||||
# start with a slash, but contains one). Thanks for the
|
||||
# clue, Roland.
|
||||
# On DOS/Windows system the filesystem apparently can't track
|
||||
# timestamps with second granularity (!!). Change the sleep time
|
||||
# needed to force a file to be considered "old".
|
||||
$wtime = $port_type eq 'UNIX' ? 1 : $port_type eq 'OS/2' ? 2 : 4;
|
||||
|
||||
if (index ($make_path, ":") != 1 && index ($make_path, "/") > 0)
|
||||
{
|
||||
$mkpath = "$pwd$pathsep$make_path";
|
||||
}
|
||||
else
|
||||
{
|
||||
$mkpath = $make_path;
|
||||
}
|
||||
# Find the full pathname of Make. For DOS systems this is more
|
||||
# complicated, so we ask make itself.
|
||||
if ($osname eq 'VMS') {
|
||||
$port_type = 'VMS-DCL' unless defined $ENV{"SHELL"};
|
||||
# On VMS pre-setup make to be found with simply 'make'.
|
||||
$make_path = 'make';
|
||||
} else {
|
||||
create_file('make.mk', 'all:;$(info $(MAKE))');
|
||||
my $mk = `$make_path -sf make.mk`;
|
||||
unlink('make.mk');
|
||||
chop $mk;
|
||||
$mk or die "FATAL ERROR: Cannot determine the value of \$(MAKE)\n";
|
||||
$make_path = $mk;
|
||||
}
|
||||
($mpv, $mpd, $mpf) = splitpath($make_path);
|
||||
|
||||
# If srcdir wasn't provided on the command line, see if the
|
||||
# location of the make program gives us a clue. Don't fail if not;
|
||||
# we'll assume it's been installed into /usr/include or wherever.
|
||||
if (! $srcdir) {
|
||||
$make_path =~ /^(.*$pathsep)?/;
|
||||
my $d = $1 || '../';
|
||||
-f "${d}/src/gnumake.h" and $srcdir = $d;
|
||||
}
|
||||
# Ask make what shell to use
|
||||
create_file('shell.mk', 'all:;$(info $(SHELL))');
|
||||
$sh_name = `$make_path -sf shell.mk`;
|
||||
unlink('shell.mk');
|
||||
chop $sh_name;
|
||||
if (! $sh_name) {
|
||||
print "Cannot determine shell\n";
|
||||
$is_posix_sh = 0;
|
||||
} else {
|
||||
my $o = `$sh_name -c ': do nothing' 2>&1`;
|
||||
$is_posix_sh = $? == 0 && $o eq '';
|
||||
}
|
||||
|
||||
# Not with the make program, so see if we can get it out of the makefile
|
||||
if (! $srcdir && open(MF, "< ../Makefile")) {
|
||||
local $/ = undef;
|
||||
$_ = <MF>;
|
||||
close(MF);
|
||||
/^abs_srcdir\s*=\s*(.*?)\s*$/m;
|
||||
-f "$1/src/gnumake.h" and $srcdir = $1;
|
||||
}
|
||||
$string = `$make_path -v`;
|
||||
$string =~ /^(GNU Make [^,\n]*)/ or die "$make_path is not GNU make. Version:\n$string";
|
||||
$testee_version = "$1\n";
|
||||
|
||||
# Get Purify log info--if any.
|
||||
create_file('null.mk', '');
|
||||
|
||||
if (exists $ENV{PURIFYOPTIONS}
|
||||
&& $ENV{PURIFYOPTIONS} =~ /.*-logfile=([^ ]+)/) {
|
||||
$pure_log = $1 || '';
|
||||
$pure_log =~ s/%v/$make_name/;
|
||||
$purify_errors = 0;
|
||||
}
|
||||
my $redir = '2>&1';
|
||||
$redir = '' if os_name eq 'VMS';
|
||||
$string = `$make_path -f null.mk $redir`;
|
||||
if ($string =~ /(.*): \*\*\* No targets\. Stop\./) {
|
||||
$make_name = $1;
|
||||
} else {
|
||||
$make_name = $mpf;
|
||||
}
|
||||
|
||||
$string = `$make_path -j 2 -f null.mk $redir`;
|
||||
if ($string =~ /not supported/) {
|
||||
$parallel_jobs = 0;
|
||||
}
|
||||
else {
|
||||
$parallel_jobs = 1;
|
||||
}
|
||||
# prepend pwd if this is a relative path (ie, does not
|
||||
# start with a slash, but contains one). Thanks for the
|
||||
# clue, Roland.
|
||||
|
||||
unlink('null.mk');
|
||||
if ($mpd && !file_name_is_absolute($make_path) && $cwdvol == $mpv) {
|
||||
$mkpath = catpath($cwdvol, catdir($cwd, $mpd), $mpf);
|
||||
} else {
|
||||
$mkpath = $make_path;
|
||||
}
|
||||
|
||||
create_file('features.mk', 'all:;$(info $(.FEATURES))');
|
||||
%FEATURES = map { $_ => 1 } split /\s+/, `$make_path -sf features.mk`;
|
||||
unlink('features.mk');
|
||||
# Not with the make program, so see if we can get it out of the makefile
|
||||
if (! $srcdir && open(MF, '<', catfile(updir(), 'Makefile'))) {
|
||||
local $/ = undef;
|
||||
$_ = <MF>;
|
||||
close(MF);
|
||||
/^abs_srcdir\s*=\s*(.*?)\s*$/m;
|
||||
-f catfile($1, 'src', 'gnumake.h') and $srcdir = $1;
|
||||
}
|
||||
|
||||
# Set up for valgrind, if requested.
|
||||
# Get Purify log info--if any.
|
||||
|
||||
$make_command = $make_path;
|
||||
if (exists $ENV{PURIFYOPTIONS}
|
||||
&& $ENV{PURIFYOPTIONS} =~ /.*-logfile=([^ ]+)/) {
|
||||
$pure_log = $1 || '';
|
||||
$pure_log =~ s/%v/$make_name/;
|
||||
$purify_errors = 0;
|
||||
}
|
||||
|
||||
if ($valgrind) {
|
||||
my $args = $valgrind_args;
|
||||
open(VALGRIND, "> valgrind.out")
|
||||
|| die "Cannot open valgrind.out: $!\n";
|
||||
# -q --leak-check=yes
|
||||
exists $ENV{VALGRIND_ARGS} and $args = $ENV{VALGRIND_ARGS};
|
||||
$make_path = "valgrind --log-fd=".fileno(VALGRIND)." $args $make_path";
|
||||
# F_SETFD is 2
|
||||
fcntl(VALGRIND, 2, 0) or die "fcntl(setfd) failed: $!\n";
|
||||
system("echo Starting on `date` 1>&".fileno(VALGRIND));
|
||||
print "Enabled valgrind support.\n";
|
||||
}
|
||||
$string = `$make_path -j 2 -f null.mk $redir`;
|
||||
if ($string =~ /not supported/) {
|
||||
$parallel_jobs = 0;
|
||||
}
|
||||
else {
|
||||
$parallel_jobs = 1;
|
||||
}
|
||||
|
||||
if ($debug) {
|
||||
print "Port type: $port_type\n";
|
||||
print "Make path: $make_path\n";
|
||||
print "Shell path: $sh_name".($is_posix_sh ? ' (POSIX)' : '')."\n";
|
||||
print "#PWD#: $pwd\n";
|
||||
print "#PERL#: $perl_name\n";
|
||||
print "#MAKEPATH#: $mkpath\n";
|
||||
print "#MAKE#: $make_name\n";
|
||||
}
|
||||
unlink('null.mk');
|
||||
|
||||
create_file('features.mk', 'all:;$(info $(.FEATURES))');
|
||||
%FEATURES = map { $_ => 1 } split /\s+/, `$make_path -sf features.mk`;
|
||||
unlink('features.mk');
|
||||
|
||||
# Set up for valgrind, if requested.
|
||||
|
||||
$make_command = $make_path;
|
||||
|
||||
if ($valgrind) {
|
||||
my $args = $valgrind_args;
|
||||
open(VALGRIND, "> valgrind.out") or die "Cannot open valgrind.out: $!\n";
|
||||
# -q --leak-check=yes
|
||||
exists $ENV{VALGRIND_ARGS} and $args = $ENV{VALGRIND_ARGS};
|
||||
$make_path = "valgrind --log-fd=".fileno(VALGRIND)." $args $make_path";
|
||||
# F_SETFD is 2
|
||||
fcntl(VALGRIND, 2, 0) or die "fcntl(setfd) failed: $!\n";
|
||||
system("echo Starting on `date` 1>&".fileno(VALGRIND));
|
||||
print "Enabled valgrind support.\n";
|
||||
}
|
||||
|
||||
if ($debug) {
|
||||
print "Port type: $port_type\n";
|
||||
print "Make path: $make_path\n";
|
||||
print "Shell path: $sh_name".($is_posix_sh ? ' (POSIX)' : '')."\n";
|
||||
print "#PWD#: $cwdpath\n";
|
||||
print "#PERL#: $perl_name\n";
|
||||
print "#MAKEPATH#: $mkpath\n";
|
||||
print "#MAKE#: $make_name\n";
|
||||
}
|
||||
}
|
||||
|
||||
sub setup_for_test
|
||||
|
@ -14,8 +14,6 @@ $port_type eq 'W32' and return -1;
|
||||
|
||||
# Create some .o files to work with
|
||||
if ($osname eq 'VMS') {
|
||||
use Cwd;
|
||||
my $pwd = getcwd;
|
||||
# VMS AR needs real object files at this time.
|
||||
foreach $afile ('a1', 'a2', 'a3') {
|
||||
# Use non-standard extension to prevent implicit rules from recreating
|
||||
@ -210,7 +208,7 @@ run_make_test(undef, $arvar, "#MAKE#: Nothing to be done for 'default'.\n");
|
||||
|
||||
unlink('foo.vhd');
|
||||
if ($osname eq 'VMS') {
|
||||
remove_directory_tree("$pwd/artest");
|
||||
remove_directory_tree("$cwdpath/artest");
|
||||
} else {
|
||||
remove_directory_tree('artest');
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ include $(F)',
|
||||
# Now try with the file we're not updating being the actual file we're
|
||||
# including: this and the previous one test different parts of the code.
|
||||
|
||||
run_make_test(undef, 'F=b', "[ -f b ] || echo >> b\nhello\n")
|
||||
run_make_test(undef, 'F=b', "[ -f b ] || echo >> b\nhello\n");
|
||||
|
||||
&rmfiles('a','b','c');
|
||||
|
||||
|
@ -13,10 +13,10 @@ open(MAKEFILE,"> $makefile");
|
||||
|
||||
# The Contents of the MAKEFILE ...
|
||||
|
||||
print MAKEFILE "VPATH = $workdir:$sourcedir\n";
|
||||
print MAKEFILE "VPATH = $workdir:$scriptdir\n";
|
||||
print MAKEFILE "vpath %.c foo\n";
|
||||
print MAKEFILE "vpath %.c $workdir\n";
|
||||
print MAKEFILE "vpath %.c $sourcedir\n";
|
||||
print MAKEFILE "vpath %.c $scriptdir\n";
|
||||
print MAKEFILE "vpath %.h $workdir\n";
|
||||
print MAKEFILE "vpath %.c\n";
|
||||
print MAKEFILE "vpath\n";
|
||||
|
@ -7,7 +7,7 @@ $details = "This is a test of the foreach function in gnu make.
|
||||
This function starts with a space separated list of
|
||||
names and a variable. Each name in the list is subsituted
|
||||
into the variable and the given text evaluated. The general
|
||||
form of the command is $(foreach var,$list,$text). Several
|
||||
form of the command is $(foreach var,\$list,\$text). Several
|
||||
types of foreach loops are tested\n";
|
||||
|
||||
|
||||
|
@ -139,7 +139,6 @@ sub xlate
|
||||
s/\\r/\r/g;
|
||||
s/\\t/\t/g;
|
||||
s/\\f/\f/g;
|
||||
s/\\v/\v/g;
|
||||
s/\\n/\n/g;
|
||||
return $_;
|
||||
}
|
||||
|
@ -81,9 +81,7 @@ all: ; \@echo hi
|
||||
|
||||
# SV-56834 Ensure setting PATH in the makefile works properly
|
||||
mkdir('sd', 0775);
|
||||
open(my $fh, '>', 'sd/foobar');
|
||||
print $fh "exit 0\n";
|
||||
close($fh);
|
||||
create_file('sd/foobar', "exit 0\n");
|
||||
chmod 0755, 'sd/foobar';
|
||||
|
||||
run_make_test(q!
|
||||
@ -107,9 +105,7 @@ rmdir('sd');
|
||||
|
||||
# Ensure that local programs are not found if "." is not on the PATH
|
||||
|
||||
open(my $fh, '>', 'foobar');
|
||||
print $fh "exit 0\n";
|
||||
close($fh);
|
||||
create_file('foobar', "exit 0\n");
|
||||
chmod 0755, 'foobar';
|
||||
|
||||
run_make_test(q!
|
||||
|
@ -23,9 +23,11 @@ touch($example);
|
||||
|
||||
run_make_with_options("${testname}.mk", "-C $workdir clean", &get_logfile);
|
||||
|
||||
use Cwd;
|
||||
|
||||
chdir $workdir;
|
||||
$wpath = &get_this_pwd;
|
||||
chdir $pwd;
|
||||
$wpath = cwd();
|
||||
chdir $cwdpath;
|
||||
|
||||
if (-f $example) {
|
||||
$test_passed = 0;
|
||||
@ -49,10 +51,6 @@ touch($example);
|
||||
|
||||
run_make_with_options("${testname}.mk", "-C $workdir/ clean ext=slash", &get_logfile);
|
||||
|
||||
chdir $workdir;
|
||||
$wpath = &get_this_pwd;
|
||||
chdir $pwd;
|
||||
|
||||
if (-f $example) {
|
||||
$test_passed = 0;
|
||||
}
|
||||
|
@ -50,10 +50,12 @@ $answer = "This is another included makefile\n";
|
||||
&compare_output($answer,&get_logfile(1));
|
||||
|
||||
|
||||
$answer = "$mkpath ANOTHER -f $makefile
|
||||
${make_name}[1]: Entering directory '$pwd'
|
||||
$answer = subst_make_string("$mkpath ANOTHER -f $makefile
|
||||
#MAKE#[1]: Entering directory '#PWD#'
|
||||
This is another included makefile
|
||||
${make_name}[1]: Leaving directory '$pwd'\n";
|
||||
#MAKE#[1]: Leaving directory '#PWD#'\n");
|
||||
|
||||
&run_make_with_options($makefile,"-I $workdir recurse",&get_logfile);
|
||||
&compare_output($answer,&get_logfile(1));
|
||||
|
||||
1;
|
||||
|
@ -11,58 +11,57 @@ $details = "Verify that symlink handling with and without -L works properly.";
|
||||
# check for it explicitly.
|
||||
|
||||
if ($port_type eq 'W32' || !( eval { symlink("",""); 1 })) {
|
||||
# This test is N/A
|
||||
-1;
|
||||
} else {
|
||||
|
||||
# Set up a symlink sym -> dep
|
||||
# We'll make both dep and targ older than sym
|
||||
$pwd =~ m%/([^/]+)$%;
|
||||
$dirnm = $1;
|
||||
&utouch(-10, 'dep');
|
||||
&utouch(-5, 'targ');
|
||||
symlink("../$dirnm/dep", 'sym');
|
||||
|
||||
# Without -L, nothing should happen
|
||||
# With -L, it should update targ
|
||||
run_make_test('targ: sym ; @echo make $@ from $<', '',
|
||||
"#MAKE#: 'targ' is up to date.");
|
||||
run_make_test(undef, '-L', "make targ from sym");
|
||||
|
||||
# Now update dep; in all cases targ should be out of date.
|
||||
&touch('dep');
|
||||
run_make_test(undef, '', "make targ from sym");
|
||||
run_make_test(undef, '-L', "make targ from sym");
|
||||
|
||||
# Now update targ; in all cases targ should be up to date.
|
||||
&touch('targ');
|
||||
run_make_test(undef, '', "#MAKE#: 'targ' is up to date.");
|
||||
run_make_test(undef, '-L', "#MAKE#: 'targ' is up to date.");
|
||||
|
||||
# Add in a new link between sym and dep. Be sure it's newer than targ.
|
||||
sleep(1);
|
||||
rename('dep', 'dep1');
|
||||
symlink('dep1', 'dep');
|
||||
|
||||
# Without -L, nothing should happen
|
||||
# With -L, it should update targ
|
||||
run_make_test(undef, '', "#MAKE#: 'targ' is up to date.");
|
||||
run_make_test(undef, '-L', "make targ from sym");
|
||||
|
||||
rmfiles('targ', 'dep', 'sym', 'dep1');
|
||||
|
||||
# Check handling when symlinks point to non-existent files. Without -L we
|
||||
# should get an error: with -L we should use the timestamp of the symlink.
|
||||
|
||||
symlink("../$dirname/dep", 'sym');
|
||||
run_make_test('targ: sym ; @echo make $@ from $<', '',
|
||||
"#MAKE#: *** No rule to make target 'sym', needed by 'targ'. Stop.", 512);
|
||||
|
||||
run_make_test('targ: sym ; @echo make $@ from $<', '-L',
|
||||
'make targ from sym');
|
||||
|
||||
|
||||
rmfiles('targ', 'sym');
|
||||
|
||||
1;
|
||||
# This test is N/A
|
||||
return -1;
|
||||
}
|
||||
|
||||
# Set up a symlink sym -> dep
|
||||
# We'll make both dep and targ older than sym
|
||||
&utouch(-10, 'dep');
|
||||
&utouch(-5, 'targ');
|
||||
|
||||
$dirnm = (splitdir($cwddir))[-1];
|
||||
symlink(catfile(updir(), $dirnm, 'dep'), 'sym');
|
||||
|
||||
# Without -L, nothing should happen
|
||||
# With -L, it should update targ
|
||||
run_make_test('targ: sym ; @echo make $@ from $<', '',
|
||||
"#MAKE#: 'targ' is up to date.");
|
||||
run_make_test(undef, '-L', "make targ from sym");
|
||||
|
||||
# Now update dep; in all cases targ should be out of date.
|
||||
&touch('dep');
|
||||
run_make_test(undef, '', "make targ from sym");
|
||||
run_make_test(undef, '-L', "make targ from sym");
|
||||
|
||||
# Now update targ; in all cases targ should be up to date.
|
||||
&touch('targ');
|
||||
run_make_test(undef, '', "#MAKE#: 'targ' is up to date.");
|
||||
run_make_test(undef, '-L', "#MAKE#: 'targ' is up to date.");
|
||||
|
||||
# Add in a new link between sym and dep. Be sure it's newer than targ.
|
||||
sleep(1);
|
||||
rename('dep', 'dep1');
|
||||
symlink('dep1', 'dep');
|
||||
|
||||
# Without -L, nothing should happen
|
||||
# With -L, it should update targ
|
||||
run_make_test(undef, '', "#MAKE#: 'targ' is up to date.");
|
||||
run_make_test(undef, '-L', "make targ from sym");
|
||||
|
||||
rmfiles('targ', 'dep', 'sym', 'dep1');
|
||||
|
||||
# Check handling when symlinks point to non-existent files. Without -L we
|
||||
# should get an error: with -L we should use the timestamp of the symlink.
|
||||
|
||||
symlink("../$dirnm/dep", 'sym');
|
||||
run_make_test('targ: sym ; @echo make $@ from $<', '',
|
||||
"#MAKE#: *** No rule to make target 'sym', needed by 'targ'. Stop.", 512);
|
||||
|
||||
run_make_test('targ: sym ; @echo make $@ from $<', '-L',
|
||||
'make targ from sym');
|
||||
|
||||
|
||||
rmfiles('targ', 'sym');
|
||||
|
||||
1;
|
||||
|
@ -1,3 +1,5 @@
|
||||
# -*-perl-*-
|
||||
|
||||
$description = "The following test creates a makefile to override part\n"
|
||||
."of one Makefile with Another Makefile with the .DEFAULT\n"
|
||||
."rule.";
|
||||
@ -9,41 +11,21 @@ $details = "This tests the use of the .DEFAULT special target to say that \n"
|
||||
."defined here but passes the target bar on to another makefile\n"
|
||||
."which does have the target bar defined.\n";
|
||||
|
||||
$makefile2 = &get_tmpfile;
|
||||
create_file('defsub.mk', q!
|
||||
bar: ; @echo Executing rule BAR
|
||||
!);
|
||||
|
||||
open(MAKEFILE,"> $makefile");
|
||||
run_make_test(q!
|
||||
foo:; @echo Executing rule FOO
|
||||
|
||||
# The Contents of the MAKEFILE ...
|
||||
.DEFAULT: ; @$(MAKE) -f defsub.mk $@
|
||||
!,
|
||||
'bar',"#MAKE#[1]: Entering directory '#PWD#'\n"
|
||||
. "Executing rule BAR\n"
|
||||
. "#MAKE#[1]: Leaving directory '#PWD#'\n");
|
||||
|
||||
print MAKEFILE "foo:\n";
|
||||
print MAKEFILE "\t\@echo Executing rule FOO\n\n";
|
||||
print MAKEFILE ".DEFAULT:\n";
|
||||
print MAKEFILE "\t\@\$(MAKE) -f $makefile2 \$\@ \n";
|
||||
unlink('defsub.mk');
|
||||
|
||||
# END of Contents of MAKEFILE
|
||||
|
||||
close(MAKEFILE);
|
||||
|
||||
|
||||
open(MAKEFILE,"> $makefile2");
|
||||
|
||||
print MAKEFILE "bar:\n";
|
||||
print MAKEFILE "\t\@echo Executing rule BAR\n\n";
|
||||
|
||||
close(MAKEFILE);
|
||||
|
||||
&run_make_with_options($makefile,'bar',&get_logfile);
|
||||
|
||||
# Create the answer to what should be produced by this Makefile
|
||||
$answer = "${make_name}[1]: Entering directory '$pwd'\n"
|
||||
. "Executing rule BAR\n"
|
||||
. "${make_name}[1]: Leaving directory '$pwd'\n";
|
||||
|
||||
# COMPARE RESULTS
|
||||
|
||||
&compare_output($answer,&get_logfile(1));
|
||||
|
||||
# This tells the test driver that the perl test script executed properly.
|
||||
1;
|
||||
|
||||
|
||||
|
@ -1,20 +1,16 @@
|
||||
# -*-perl-*-
|
||||
|
||||
$description = "This tests the CURDIR varaible.";
|
||||
$description = "This tests the CURDIR variable.";
|
||||
|
||||
$details = "Echo CURDIR both with and without -C. Also ensure overrides work.";
|
||||
|
||||
open(MAKEFILE,"> $makefile");
|
||||
print MAKEFILE "all: ; \@echo \$(CURDIR)\n";
|
||||
close(MAKEFILE);
|
||||
|
||||
|
||||
# TEST #1
|
||||
# -------
|
||||
|
||||
&run_make_with_options($makefile,"",&get_logfile);
|
||||
$answer = "$pwd\n";
|
||||
&compare_output($answer,&get_logfile(1));
|
||||
|
||||
run_make_test(q!
|
||||
all: ; @echo $(CURDIR)
|
||||
!,
|
||||
'', "#PWD#\n");
|
||||
|
||||
1;
|
||||
|
@ -72,7 +72,7 @@ $answer = ".x\n$dir/foo.x\nx\n\$@.x\n$dir.x\nfoo.x\n$dir/bar.x\nbar.x\n";
|
||||
&compare_output($answer, &get_logfile(1));
|
||||
|
||||
&run_make_with_options($makefile2, "$dir/x.z $dir/y.z", &get_logfile);
|
||||
$answer = ".x\n$dir/x.z.x\nx\n\$@.x\n$dir.x\nx.z.x\n.y\n$dir/y.z.y\n\y\n\$@.y\n$dir.y\ny.z.y\n";
|
||||
$answer = ".x\n$dir/x.z.x\nx\n\$@.x\n$dir.x\nx.z.x\n.y\n$dir/y.z.y\ny\n\$@.y\n$dir.y\ny.z.y\n";
|
||||
&compare_output($answer, &get_logfile(1));
|
||||
|
||||
&run_make_with_options($makefile2, "$dir/biz", &get_logfile);
|
||||
|
@ -25,7 +25,7 @@ $mk_string = "text : text.tlb(file1.txt)\n\n" .
|
||||
"file1.txt :\n" .
|
||||
"\t\@pipe open/write xxx file1.txt ; write xxx \"text file\" ; close xxx\n";
|
||||
|
||||
my $answer = "library /replace text.tlb file1.txt";
|
||||
$answer = "library /replace text.tlb file1.txt";
|
||||
|
||||
run_make_test($mk_string,
|
||||
'', $answer);
|
||||
@ -37,10 +37,10 @@ unlink('file1.txt');
|
||||
#Macro library
|
||||
$mk_string = "macro : macro.mlb(file1.mar)\n\n" .
|
||||
"file1.mar :\n" .
|
||||
"\t\pipe open/write xxx file1.mar ; " .
|
||||
"\tpipe open/write xxx file1.mar ; " .
|
||||
"write xxx \".macro a b\" ; write xxx \".endm\" ; close xxx\n";
|
||||
|
||||
my $answer = "library /replace macro.mlb file1.mar";
|
||||
$answer = "library /replace macro.mlb file1.mar";
|
||||
|
||||
run_make_test($mk_string,
|
||||
'', $answer);
|
||||
@ -58,7 +58,7 @@ $mk_string =
|
||||
"file2.c :\n" .
|
||||
"\t\@pipe open/write xxx file2.c ; write xxx \"file2(){}\" ; close xxx\n";
|
||||
|
||||
my $answer = "library /replace imagelib.olb file2.exe";
|
||||
$answer = "library /replace imagelib.olb file2.exe";
|
||||
|
||||
run_make_test($mk_string,
|
||||
'', $answer);
|
||||
|
1238
tests/test_driver.pl
1238
tests/test_driver.pl
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user