This adds to makedef.pl a new platform, "test".
Hopefully this change will catch most problems that previously had resulted
in build failures on Win32.
t/porting/exec-bit.t Check that exec-bit bins are identified
t/porting/filenames.t Check the MANIFEST for filename portability.
t/porting/FindExt.t Test win32/FindExt.pm
+t/porting/globvar.t Check that globvar.sym is sane
t/porting/known_pod_issues.dat Data file for porting/podcheck.t
t/porting/maintainers.t Test that Porting/Maintainers.pl is up to date
t/porting/manifest.t Test that this MANIFEST file is well formed
close $out or die "Can't close $mpm: $!";
}
-my @args = (platform => [map {"PLATFORM=$_"} qw(aix win32 wince os2 netware vms)],
+my @args = (platform => [map {"PLATFORM=$_"} qw(aix win32 wince os2 netware vms test)],
cflags => ['', 'CCFLAGS=-Dperl=rules -Dzzz'],
Deq => ['', '-Dbeer=foamy'],
D => ['', '-DPERL_IMPLICIT_SYS'],
}
{
- my @PLATFORM = qw(aix win32 wince os2 netware vms);
+ my @PLATFORM = qw(aix win32 wince os2 netware vms test);
my %PLATFORM;
@PLATFORM{@PLATFORM} = ();
# minimal configs that don't include any of those options.
my @options = sort(Config::bincompat_options(), Config::non_bincompat_options());
-print STDERR "Options: (@options)\n";
+print STDERR "Options: (@options)\n" unless $ARGS{PLATFORM} eq 'test';
$define{$_} = 1 foreach @options;
my %exportperlmalloc =
# perl.h logic duplication ends
-print STDERR "Defines: (" . join(' ', sort keys %define) . ")\n";
+print STDERR "Defines: (" . join(' ', sort keys %define) . ")\n"
+ unless $ARGS{PLATFORM} eq 'test';
my $sym_ord = 0;
my %ordinal;
=item *
-XXX
+F<t/porting/globvar.t> has been added, to run a sanity check on F<globar.sym>.
+F<globar.sym> is not needed on most *nix platforms, but is for Win32, hence
+previously was it was possible to inadvertently commit changes that worked
+perfectly locally, but broke the build on Win32.
=back
--- /dev/null
+#!perl -w
+
+use TestInit qw(T);
+use strict;
+use Config;
+
+require 't/test.pl';
+
+skip_all("Code to read symbols not ported to $^O")
+ if $^O eq 'VMS' or $^O eq 'Win32';
+
+# Not investigated *why* we don't export these, but we don't, and we've not
+# received any bug reports about it causing problems:
+my %skip = map { ("PL_$_", 1) }
+ qw(
+ DBcv bitcount cshname force_link_funcs generation lastgotoprobe
+ latin1_lc mod_latin1_uc modcount no_symref_sv timesbuf uudmap
+ watchaddr watchok
+ );
+
+my $trial = "nm globals$Config{_o} 2>&1";
+my $yes = `$trial`;
+
+skip_all("Could not run `$trial`") if $?;
+
+my $defined = qr/^[0-9a-fA-F]{8,16}\s+[^Uu]\s+_?/m;
+
+skip_all("Could not spot definition of PL_Yes in output of `$trial`")
+ unless $yes =~ /${defined}PL_Yes/m;
+
+my %exported;
+open my $fh, '-|', $^X, '-Ilib', './makedef.pl', 'PLATFORM=test'
+ or die "Can't run makedef.pl";
+
+while (<$fh>) {
+ next unless /^PL_/;
+ chomp;
+ ++$exported{$_};
+}
+
+close $fh or die "Problem running makedef.pl";
+
+my %unexported;
+
+foreach my $file (map {$_ . $Config{_o}} qw(globals regcomp)) {
+ open $fh, '-|', 'nm', $file
+ or die "Can't run nm $file";
+
+ while (<$fh>) {
+ next unless /$defined(PL_\S+)/;
+ if (delete $exported{$1}) {
+ note("Seen definition of $1");
+ next;
+ }
+ ++$unexported{$1};
+ }
+ close $fh or die "Problem running nm $file";
+}
+
+fail("Attempting to export '$_' which is never defined")
+ foreach sort keys %exported;
+
+foreach (sort keys %unexported) {
+ SKIP: {
+ skip("We don't export $_", 1) if $skip{$_};
+ fail("$_ is defined, but we do not export it");
+ }
+}
+
+done_testing();