Subject: perl-5.10.0-4 -> perl-5.10.0-5 site_perl update needed
From: "Reini Urban" <[email-masked]>
To: [email-masked]
Cc: P5P <[email-masked]>
Date: Thu, 10 Jul 2008 10:16:18 +0200
List-Id: <cygwin.cygwin.com>

2008/7/9 Reini Urban:
> 2008/7/9 Reini Urban:
>> 2008/7/8 Reini Urban:
>>> 2008/7/8 Gary R. Van Sickle:
>>>> Hi Reini,
>>>>
>>>> It looks like something changed between perl 5.10.0-4 and -5 which breaks
>>>> the DateTime module from CPAN (version 0.4302, latest).  The attached Simple
>>>> Test Case(tm) results in only the following errors:
>>>>
>>>> Use of uninitialized value $id in pattern match (m//) at
>>>> /usr/lib/perl5/site_perl/5.10/DateTime/Locale.pm line 65.
>>>
>>> Bad side-effect with a third party module in site_perl.
>>> Strange that I didn't see this in my tests, because I tested over
>>> thousand CPAN modules with this release.
>>> Oh, I see, I reported that it failed on June 5.
>>>
>>> $ cpan DateTime
>>> requires DateTime::Locale
>>>
>>> DateTime::Locale cannot be installed because of this error,
>>> but since you upgraded perl we have to fix DateTime::Locale now.
>>>
>>> Oops. This seems to affect more modules.
>>> Params::Validate with type => SCALAR seems to be broken.
>>>  http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Params%3A%3AValidate
>>>
>>> I have to go now, but will provide a patch soon.
>>> As workaround I would disable the validation in DateTime::Locale::_register
>>> but this also doesn't work as expected.
>>>
>>>    if (! defined $p{id} or !$id) {
>>>        # cygperl5 error in Params::Validate?
>>>        #warn "Broken Params::Validate. Given ".join(",",@_);
>>>        $p{id} = $_[0];
>>>        $p{en_language} = $_[1];
>>>        my @keys = qw(en_script en_territory en_variant native_language
>>> native_script native_territory native_variant class replace);
>>>        for my $i (2 .. @_) {
>>>            $p{$keys[$i]} = $_[$i];
>>>        }
>>>    }
>>
>> Update on this issue:
>> As you can see, there's only one machine with this error, which is my laptop.
>> http://cpantesters.perl.org/show/DateTime-Locale.html#DateTime-Locale-0.4001
>> My normal devel machine passed the DateTime::Locale test, which is weird.
>> I also pass the Params::Validate test on my laptop, which is weirder,
>> because this fails for DateTime::Locale on my laptop.
>>
>> Anyway, until I find out the differences between my laptop and my
>> devel machine,
>> the short summary:
>>
>> Params::Validate fails in an BEGIN block, in a type => SCALAR check only on
>> certain machines with 5.10.0 patch 34065 on Cygwin. (Tested only
>> release and patch 34065).
>> Reproducible with DateTime::Locale.
>> Within the debugger everything works ok. (Probably because of the BEGIN block)
>> The other DateTime::Locale reports show no clue.
>> There's a Darwin report on the same patchlevel which passed.
>>
>> Within DateTime-Locale-0.4001 after make
>> even perl -Mblib -cw t/01basic.t fails with the same errors.
>>
>> Moving the register call from BEGIN to INIT also does not help.
>
> The adhoc workaround for perl-5.10.0-5 is to move away the Validate XS module:
>
> mv /usr/lib/perl5/site_perl/5.10/i686-cygwin/auto/Params/Validate/Validate.dll \
>  /usr/lib/perl5/site_perl/5.10/i686-cygwin/auto/Params/Validate/_Validate.dll
>
> Now it works, because Params::Validate has a slower pure-perl fallback.

I've analyzed the symbols in the dll's and found the explanation and
solution for this update problems. p5p and module authors need not to
be concerned. It's a simple cygwin perl update problem.

In short:
All old perl-5.10.0-4 generated binary site_perl modules need to be
recompiled with perl-5.10.0-5.
They are not ABI cross-compatible with the new vendor and archlib modules.

Explanation:
perl-5.10.0-5 is based on patchlevel 34065, perl-5.10.0-4 was based on
plain 5.10.0 with a lot of patches.

perl-5.10.0-5 adds a new utf8 handling of strings via a new
newSVpvn_flags function
sv.h: #define newSVpvn_utf8(s, len, u) newSVpvn_flags((s), (len), (u)
? SVf_UTF8 : 0)
perl-5.10.0-4 does not contain newSVpvn_utf8 nor newSVpvn_flags.

So any new XS module using strings may not call an old perl-5.10.0-4 dll, which
does not contain the _utf8  and _flags functions.

Solution:
# delete all old site packages with dll's and reinstall them
for pack in $(find /usr/lib/perl5/site_perl/5.10/i686-cygwin/auto \
  -name .packlist \! -newer /bin/perl.exe);
do
  grep .dll $pack && rm -f $(cat $pack)
done | \
perl -MCPAN -ne'
s|/usr/lib/perl5/site_perl/5.10/i686-cygwin/auto/(.+?)/\w+\.dll$|$1|;
s|/|::|g; push @p, $_; END {install(@p) }'

should recompile them all.

-- 
Reini Urban
http://phpwiki.org/ http://murbreak.at/

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/