On Wed Aug 29 06:42:28 2007, doughera wrote: > On Tue, 28 Aug 2007, James Keenan via RT wrote: > > > On Tue Aug 28 10:00:38 2007, doughera wrote: > > > On Solaris, I'm getting the following failure in both 107- > > > inter_progs.01.t > > > and .02 .t. I suspect it has to do with the use of callbacks in > the > > > Solaris hints file. I don't know offhand what's trying to OPEN > what, > > > but > > > the TIEHANDLE emulation in Parrot::IO::Capture::Mini is > incomplete. > > > > >
While it may be incomplete, further analysis suggests it's not the main problem. Read on. > [snip] > As I said, I think this shows up here due to the use of callbacks in > the > hints file. You should be able to reproduce this on Linux (or any > other > operating system) by using callbacks there. Here's a simple > (untested) > patch for hints/linux.pm that will probably trigger the same problem. > > --- parrot-current/config/init/hints/linux.pm Tue Aug 14 16:06:54 2007 > +++ parrot-andy/config/init/hints/linux.pm Wed Aug 29 09:09:00 2007 > @@ -69,6 +69,34 @@ > $cc_flags .= ' -D_GNU_SOURCE'; > } > > + ### XXX This is a dummy callback to test callbacks > + # Run the gcc version test to see if $cc is really gcc. > + my $linux_link_cb = sub { > + use Parrot::Configure::Step qw(cc_gen cc_run); > + use Carp; > + my ( $key, $cc ) = @_; > + my %gnuc; > + my $link = $conf->data->get('link'); > + cc_gen("config/auto/gcc/test_c.in"); > + > + # Can't call cc_build since we haven't set all the flags yet. > + # This should suffice for this test. > + my $cc_inc = $conf->data->get('cc_inc'); > + Parrot::Configure::Step::_run_command( "$cc -o test test.c > $cc_inc", 'test.cco', 'test.cco' ) > + and confess "C compiler failed (see test.cco)"; > + %gnuc = eval cc_run() or die "Can't run the test program: > $!"; > + if ( defined $gnuc{__GNUC__} ) { > + # $link = 'g++'; # don't actually set it in this test > function. > + $conf->data->set( link => $link ); > + } > + else { > + # Don't know what compiler we have, so don't touch $link. > + } > + $conf->data->deltrigger( "cc", "linux_link" ); > + }; > + $conf->data->settrigger( "cc", "linux_link", $linux_link_cb ); > + ### XXX End of dummy callback to test callbacks > + > $conf->data->set( > ccflags => $cc_flags, > libs => $libs, > For diagnostic purposes, this patch was very helpful. (See full file attached as linux.pm.) But I then asked myself, "Self, what would happen if I abandoned my attempt to keep the test output clean and did not attempt to capture what was appearing on STDOUT? In other words, what would happen if I deactivated all the Parrot::IO::Capture::Mini-related code in the failing test file?" (See attached file 107-inter_progs.01.t.) The result was this: [li11-226:reconf] 565 $ prove t/configure/107-inter_progs.01.t t/configure/107-inter_progs.01....ok 1/24C compiler failed (see test.cco) at config/init/hints/linux.pm line 85 init::hints::linux::__ANON__('cc', 'foo_alpha') called at lib/Parrot/Configure/Data.pm line 120 Parrot::Configure::Data::set('Parrot::Configure::Data=HASH(0x828d994)') called at config/inter/progs.pm line 69 inter::progs::runstep('inter::progs=HASH(0x8388b84)', 'Parrot::Configure=HASH(0x828d9d0)') called at t/configure/107-inter_progs.01.t line 74 # Looks like you planned 24 tests but only ran 21. # Looks like your test died just after 21. t/configure/107-inter_progs.01....dubious Test returned status 255 (wstat 65280, 0xff00) DIED. FAILED tests 22-24 Failed 3/24 tests, 87.50% okay Failed Test Stat Wstat Total Fail List of Failed ------------------------------------------------------------------------------- t/configure/107-inter_progs.01.t 255 65280 24 6 22-24 Failed 1/1 test scripts. 3/24 subtests failed. Files=1, Tests=24, 0 wallclock secs ( 0.05 cusr + 0.00 csys = 0.05 CPU) Failed 1/1 test programs. 3/24 subtests failed. So this test -- which would pass on Linux if your diagnostic code were not included in config/init/hints/linux.pm -- fails even in the absence of Parrot::IO::Capture::Mini-related code. Which essentially means that the testing strategy I followed in this file breaks down when the code in a config/init/hints/*someOS*.pm file is too complex for my current understanding. So for the time being, I am commenting out several of the tests in 107-inter_progs.01.t and 107-inter_progs.02.t kid51
107-inter_progs.01.t
Description: Binary data
# Copyright (C) 2005-2007, The Perl Foundation. # $Id: linux.pm 20469 2007-08-04 02:44:24Z jkeenan $ package init::hints::linux; use strict; use warnings; use Config; sub runstep { my ( $self, $conf ) = @_; my $libs = $conf->option_or_data('libs'); my $cc_flags = $conf->option_or_data('ccflags'); my $cc = $conf->option_or_data('cc'); my $linkflags = $conf->option_or_data('linkflags'); # should find g++ in most cases my $link = $conf->data->get('link') || 'c++'; if ( $libs !~ /-lpthread/ ) { $libs .= ' -lpthread'; } my $ld_share_flags = $conf->data->get('ld_share_flags'); my $cc_shared = $conf->data->get('cc_shared'); if ( $cc =~ /icc/ ) { # Intel C++ compiler has the same name as its C compiler $link = $cc; # don't allow icc to pretend it's gcc $cc_flags .= ' -no-gcc'; # suppress sprintf warnings that don't apply $cc_flags .= ' -wd269'; $cc_flags .= ' -Wall -Wcheck -w2'; $ld_share_flags = ' -shared -g -pipe -fexceptions -fPIC'; $cc_shared .= ' -fPIC'; } elsif ( $cc =~ /suncc/ ) { $link = 'sunCC'; if ( $ld_share_flags !~ /-KPIC/ ) { $ld_share_flags = '-KPIC'; } if ( $cc_shared !~ /-KPIC/ ) { $cc_shared = '-KPIC'; } } else { if ( $ld_share_flags !~ /-fPIC/ ) { $ld_share_flags .= ' -fPIC'; } if ( $cc_shared !~ /-fPIC/ ) { $cc_shared .= ' -fPIC'; } # --export-dynamic, s. info gcc, ld $linkflags .= ' -Wl,-E'; } if ( $cc_flags !~ /-D_GNU_SOURCE/ ) { # Request visibility of all POSIX symbols # _XOPEN_SOURCE=600 doesn't work with glibc 2.1.3 # _XOPEN_SOURCE=500 gives 2 undefined warns (setenv, unsetenv) on 2.1.3 $cc_flags .= ' -D_GNU_SOURCE'; } ### XXX This is a dummy callback to test callbacks # Run the gcc version test to see if $cc is really gcc. my $linux_link_cb = sub { use Parrot::Configure::Step qw(cc_gen cc_run); use Carp; my ( $key, $cc ) = @_; my %gnuc; my $link = $conf->data->get('link'); cc_gen("config/auto/gcc/test_c.in"); # Can't call cc_build since we haven't set all the flags yet. # This should suffice for this test. my $cc_inc = $conf->data->get('cc_inc'); Parrot::Configure::Step::_run_command( "$cc -o test test.c $cc_inc", 'test.cco', 'test.cco' ) and confess "C compiler failed (see test.cco)"; %gnuc = eval cc_run() or die "Can't run the test program: $!"; if ( defined $gnuc{__GNUC__} ) { # $link = 'g++'; # don't actually set it in this test function. $conf->data->set( link => $link ); } else { # Don't know what compiler we have, so don't touch $link. } $conf->data->deltrigger( "cc", "linux_link" ); }; $conf->data->settrigger( "cc", "linux_link", $linux_link_cb ); ### XXX End of dummy callback to test callbacks $conf->data->set( ccflags => $cc_flags, libs => $libs, ld_share_flags => $ld_share_flags, ld_load_flags => $ld_share_flags, i_lib_pthread => 1, # RT#43149 fake a header entry linkflags => $linkflags, link => $link, cc_shared => $cc_shared, rpath => '-Wl,-rpath=', has_dynamic_linking => 1, parrot_is_shared => 1, libparrot_shared => 'libparrot$(SHARE_EXT).$(SOVERSION)', libparrot_shared_alias => 'libparrot$(SHARE_EXT)', libparrot_soname => '-Wl,-soname=libparrot$(SHARE_EXT).$(SOVERSION)', ); if ( ( split( '-', $Config{archname} ) )[0] eq 'ia64' ) { $conf->data->set( platform_asm => 1 ); } return; } 1; # Local Variables: # mode: cperl # cperl-indent-level: 4 # fill-column: 100 # End: # vim: expandtab shiftwidth=4: