From: Alexx83 <no...@so...> - 2013-03-26 19:35:01
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Repository: msys2-tools". The branch, master has been updated via 6565f58c1fbc376f00dcb1497b3674b37370c083 (commit) from 6529be9295457005b9e68f6df86919ddf7c107bf (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- https://sf.net/p/mingw/msys2-tools/ci/6565f58c1fbc376f00dcb1497b3674b37370c083/ commit 6565f58c1fbc376f00dcb1497b3674b37370c083 Author: Alexpux <ale...@gm...> Date: Tue Mar 26 23:34:43 2013 +0400 Add patches for Perl-5.14.4 diff --git a/perl/msys2-perl.patch b/perl/msys2-perl.patch new file mode 100644 index 0000000..4344f92 --- /dev/null +++ b/perl/msys2-perl.patch @@ -0,0 +1,131 @@ +diff -Naur perl-5.14.4/configpm ../perl-5.14.4/configpm +--- perl-5.14.4/configpm 2012-12-19 12:25:23.000000000 +0000 ++++ ../perl-5.14.4/configpm 2013-03-24 11:26:08.205078200 +0000 +@@ -203,7 +203,7 @@ + print " $date\n" if defined $date; + + my @env = map { "$_=\"$ENV{$_}\"" } sort grep {/^PERL/} keys %ENV; +- push @env, "CYGWIN=\"$ENV{CYGWIN}\"" if $^O eq 'cygwin' and $ENV{CYGWIN}; ++ push @env, "MSYS=\"$ENV{MSYS}\"" if $^O eq 'cygwin' and $ENV{MSYS}; + + if (@env) { + print " \%ENV:\n"; +diff -Naur perl-5.14.4/Configure ../perl-5.14.4/Configure +--- perl-5.14.4/Configure 2013-03-24 09:31:31.509765700 +0000 ++++ ../perl-5.14.4/Configure 2013-03-24 11:26:08.220703200 +0000 +@@ -3243,6 +3243,9 @@ + cygwin*) osname=cygwin + osvers="$3" + ;; ++ msys*) osname=cygwin ++ osvers="$3" ++ ;; + *dc.osx) osname=dcosx + osvers="$3" + ;; +@@ -8247,10 +8250,10 @@ + dflt=libperl.$so + ;; + cygwin*) # ld links now against the dll directly +- majmin="cygperl5_${patchlevel}_${subversion}.${so}" ++ majmin="msys-perl5_${patchlevel}_${subversion}.${so}" + majonly=`echo $patchlevel $subversion | + $awk '{printf "%03d%03d", $1, $2}'` +- majonly=cygperl5.$majonly.$so ++ majonly=msys-perl5.$majonly.$so + dflt=$majmin + ;; + *) # Try to guess based on whether libc has major.minor. +diff -Naur perl-5.14.4/cpan/CPANPLUS/lib/CPANPLUS/Internals/Report.pm ../perl-5.14.4/cpan/CPANPLUS/lib/CPANPLUS/Internals/Report.pm +--- perl-5.14.4/cpan/CPANPLUS/lib/CPANPLUS/Internals/Report.pm 2012-12-19 12:25:23.000000000 +0000 ++++ ../perl-5.14.4/cpan/CPANPLUS/lib/CPANPLUS/Internals/Report.pm 2013-03-24 11:26:08.236328200 +0000 +@@ -132,7 +132,7 @@ + { + 'grade' => 'FAIL', + 'dist' => 'CPANPLUS-0.042', +- 'platform' => 'cygwin-multi-64int', ++ 'platform' => 'msys-multi-64int', + 'details' => 'http://nntp.x.perl.org/group/perl.cpan.testers/99371' + ... + }, +diff -Naur perl-5.14.4/Cross/Makefile-cross-SH ../perl-5.14.4/Cross/Makefile-cross-SH +--- perl-5.14.4/Cross/Makefile-cross-SH 2012-12-19 12:25:23.000000000 +0000 ++++ ../perl-5.14.4/Cross/Makefile-cross-SH 2013-03-24 11:26:08.236328200 +0000 +@@ -959,7 +959,7 @@ + -rm -f perl.third lib*.so.perl.third perl.3log t/perl.third t/perl.3log + -rm -f perl.pixie lib*.so.perl.pixie lib*.so.Addrs + -rm -f perl.Addrs perl.Counts t/perl.Addrs t/perl.Counts *perl.xok +- -rm -f cygwin.c libperl*.def libperl*.dll cygperl*.dll *.exe.stackdump ++ -rm -f cygwin.c libperl*.def libperl*.dll msys-perl*.dll *.exe.stackdump + -rm -f perl$(EXE_EXT) miniperl$(EXE_EXT) $(LIBPERL) libperl.* microperl + -rm -f config.over + +diff -Naur perl-5.14.4/ext/DynaLoader/DynaLoader_pm.PL ../perl-5.14.4/ext/DynaLoader/DynaLoader_pm.PL +--- perl-5.14.4/ext/DynaLoader/DynaLoader_pm.PL 2012-12-19 12:25:24.000000000 +0000 ++++ ../perl-5.14.4/ext/DynaLoader/DynaLoader_pm.PL 2013-03-24 11:26:08.236328200 +0000 +@@ -438,7 +438,7 @@ + push(@names,"$_.$dl_dlext") unless m/\.$dl_dlext$/o; + push(@names,"$_.$dl_so") unless m/\.$dl_so$/o; + <<$^O-eq-cygwin>> +- push(@names,"cyg$_.$dl_so") unless m:/:; ++ push(@names,"msys-$_.$dl_so") unless m:/:; + <</$^O-eq-cygwin>> + push(@names,"lib$_.$dl_so") unless m:/:; + push(@names,"$_.a") if !m/\.a$/ and $dlsrc eq "dl_dld.xs"; +diff -Naur perl-5.14.4/t/io/fs.t ../perl-5.14.4/t/io/fs.t +--- perl-5.14.4/t/io/fs.t 2012-12-19 12:25:24.000000000 +0000 ++++ ../perl-5.14.4/t/io/fs.t 2013-03-24 11:26:08.251953200 +0000 +@@ -44,7 +44,7 @@ + $needs_fh_reopen = 1 if (defined &Win32::IsWin95 && Win32::IsWin95()); + + my $skip_mode_checks = +- $^O eq 'cygwin' && $ENV{CYGWIN} !~ /ntsec/; ++ $^O eq 'cygwin' && $ENV{MSYS} !~ /ntsec/; + + plan tests => 51; + +@@ -413,7 +413,7 @@ + # check if rename() can be used to just change case of filename + SKIP: { + skip "Works in Cygwin only if check_case is set to relaxed", 1 +- if ($ENV{'CYGWIN'} && ($ENV{'CYGWIN'} =~ /check_case:(?:adjust|strict)/)); ++ if ($ENV{'MSYS'} && ($ENV{'MSYS'} =~ /check_case:(?:adjust|strict)/)); + + chdir "./$tmpdir"; + open(FH,'>x') || die "Can't create x"; +diff -Naur perl-5.14.4/t/op/groups.t ../perl-5.14.4/t/op/groups.t +--- perl-5.14.4/t/op/groups.t 2012-12-19 12:25:24.000000000 +0000 ++++ ../perl-5.14.4/t/op/groups.t 2013-03-24 11:29:19.166992200 +0000 +@@ -284,7 +284,7 @@ + + # Test if this is Cygwin + sub cygwin_nt { +- return $Config::Config{myuname} =~ /^cygwin_nt/i; ++ return $Config::Config{myuname} =~ /^msys_nt/i; + } + + # Get perl's supplementary groups and the number of times each gid +diff -Naur perl-5.14.4/t/op/stat.t ../perl-5.14.4/t/op/stat.t +--- perl-5.14.4/t/op/stat.t 2012-12-19 12:25:24.000000000 +0000 ++++ ../perl-5.14.4/t/op/stat.t 2013-03-24 11:29:40.479492200 +0000 +@@ -107,7 +107,7 @@ + SKIP: { + skip "No link count", 1 if $Config{dont_use_nlink}; + skip "Cygwin9X fakes hard links by copying", 1 +- if $Config{myuname} =~ /^cygwin_(?:9\d|me)\b/i; ++ if $Config{myuname} =~ /^msys_(?:9\d|me)\b/i; + + is($nlink, 2, 'Link count on hard linked file' ); + } +diff -Naur perl-5.14.4/utils/perlbug.PL ../perl-5.14.4/utils/perlbug.PL +--- perl-5.14.4/utils/perlbug.PL 2012-12-19 12:25:24.000000000 +0000 ++++ ../perl-5.14.4/utils/perlbug.PL 2013-03-24 11:26:08.251953200 +0000 +@@ -763,7 +763,7 @@ + my @env = + qw(PATH LD_LIBRARY_PATH LANG PERL_BADLANG SHELL HOME LOGDIR LANGUAGE); + push @env, $Config{ldlibpthname} if $Config{ldlibpthname} ne ''; +- push @env, grep /^(?:PERL|LC_|LANG|CYGWIN)/, keys %ENV; ++ push @env, grep /^(?:PERL|LC_|LANG|MSYS)/, keys %ENV; + my %env; + @env{@env} = @env; + for my $env (sort keys %env) { diff --git a/perl/pl-CYG07-cygwin_vendorarchautorebase-2.patch b/perl/pl-CYG07-cygwin_vendorarchautorebase-2.patch new file mode 100644 index 0000000..51b8c74 --- /dev/null +++ b/perl/pl-CYG07-cygwin_vendorarchautorebase-2.patch @@ -0,0 +1,129 @@ +difforig perl-5.14.2/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm + +diff -u perl-5.14.2/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm.orig perl-5.14.2/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm +--- perl-5.14.2/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm.orig 2012-02-07 09:21:23.910375000 -0600 ++++ perl-5.14.2/cpan/ExtUtils-MakeMaker/lib/ExtUtils/MM_Cygwin.pm 2012-07-11 08:32:59.944125000 -0500 +@@ -9,7 +9,7 @@ + require ExtUtils::MM_Win32; + our @ISA = qw( ExtUtils::MM_Unix ); + +-our $VERSION = '6.57_05'; ++our $VERSION = '6.57_07'; + + + =head1 NAME +@@ -100,41 +100,99 @@ + + =item maybe_command + +-If our path begins with F</cygdrive/> then we use C<ExtUtils::MM_Win32> +-to determine if it may be a command. Otherwise we use the tests +-from C<ExtUtils::MM_Unix>. ++Determine whether a file is native to Cygwin by checking whether it ++resides inside the Cygwin installation (using Windows paths). If so, ++use C<ExtUtils::MM_Unix> to determine if it may be a command. ++Otherwise use the tests from C<ExtUtils::MM_Win32>. + + =cut + + sub maybe_command { + my ($self, $file) = @_; + +- if ($file =~ m{^/cygdrive/}i) { +- return ExtUtils::MM_Win32->maybe_command($file); +- } ++ my $cygpath = Cygwin::posix_to_win_path('/', 1); ++ my $filepath = Cygwin::posix_to_win_path($file, 1); + +- return $self->SUPER::maybe_command($file); ++ return (substr($filepath,0,length($cygpath)) eq $cygpath) ++ ? $self->SUPER::maybe_command($file) # Unix ++ : ExtUtils::MM_Win32->maybe_command($file); # Win32 + } + + =item dynamic_lib + + Use the default to produce the *.dll's. +-But for new archdir dll's use the same rebase address if the old exists. ++Add the dll size to F<$vendorarch/auto/.rebase>, which stores the ++next available imagebase. ++ ++If an old dll exists and .rebase is empty, use the same rebase address ++for new archdir dll's. + + =cut + + sub dynamic_lib { + my($self, %attribs) = @_; + my $s = ExtUtils::MM_Unix::dynamic_lib($self, %attribs); ++ return '' unless $s; ++ return $s unless %{$self->{XS}}; ++ + my $ori = "$self->{INSTALLARCHLIB}/auto/$self->{FULLEXT}/$self->{BASEEXT}.$self->{DLEXT}"; ++ my $rebase = "$self->{INSTALLVENDORARCH}/auto/.rebase"; ++ my $imagebase = ''; ++ my $rebaseverstr = -f '/bin/rebase' ? `/bin/rebase -V 2>&1` : '0'; ++ my ($rebasever) = $rebaseverstr =~ /rebase version ([0-9.]+)/; ++ $rebasever =~ s/(\d\.\d+)\./$1/; ++ if (-f $rebase and $rebasever < 3.02) { ++ $imagebase = `/bin/cat $rebase`; ++ chomp $imagebase; ++ } + if (-e $ori) { +- my $imagebase = `/bin/objdump -p $ori | /bin/grep ImageBase | /bin/cut -c12-`; +- chomp $imagebase; +- if ($imagebase gt "40000000") { +- my $LDDLFLAGS = $self->{LDDLFLAGS}; +- $LDDLFLAGS =~ s/-Wl,--enable-auto-image-base/-Wl,--image-base=0x$imagebase/; +- $s =~ s/ \$\(LDDLFLAGS\) / $LDDLFLAGS /m; +- } ++ $imagebase = `/bin/objdump -p $ori | /bin/grep ImageBase | /bin/cut -c12-`; ++ chomp $imagebase; ++ if ($imagebase gt "40000000" and $imagebase lt "80000000") { ++ my $LDDLFLAGS = $self->{LDDLFLAGS}; ++ $LDDLFLAGS =~ s/-Wl,--enable-auto-image-base/-Wl,--image-base=0x$imagebase/; ++ $s =~ s/ \$\(LDDLFLAGS\) / $LDDLFLAGS /m; ++ } ++ } elsif ($imagebase gt "40000000" and $imagebase lt "80000000") { ++ my $LDDLFLAGS = $self->{LDDLFLAGS}; ++ $LDDLFLAGS =~ s/-Wl,--enable-auto-image-base/-Wl,--image-base=0x$imagebase/ or ++ $LDDLFLAGS .= " -Wl,--image-base=0x$imagebase"; ++ $s =~ s/ \$\(INST_DYNAMIC_DEP\)/ \$(INST_DYNAMIC_DEP) _rebase/; ++ $s =~ s/ \$\(LDDLFLAGS\) / $LDDLFLAGS /m; ++ # Here we create all DLL's per project with the same imagebase. With rebase 3.0.2 we do better ++ $s .= "\t/bin/rebase -v -b 0x$imagebase \$@ | "; ++ $s .= "\$(FULLPERL) -n _rebase > \$(INSTALLVENDORARCH)/auto/.rebase\n"; ++ # Need a tempfile, because gmake expands $_ in the perl cmdline ++ $s .= "\n_rebase : \$(OBJECT)\n"; ++ $s .= "\t\$(NOECHO) \$(ECHO) '/new base = (.+), new size = (.+)/ && printf \"%x\\n\",hex(\$1)+hex(\$2);' > _rebase\n"; ++ } else { ++ if ($rebasever < 3.02) { # new rebase 3.0.2 with database ++ warn "Hint: run perlrebase to initialize $rebase or upgrade to rebase 3.0.2\n"; ++ } ++ } ++ $s; ++} ++ ++=item install ++ ++Rebase dll's with the global rebase database after installation. ++ ++=cut ++ ++sub install { ++ my($self, %attribs) = @_; ++ my $s = ExtUtils::MM_Unix::install($self, %attribs); ++ return '' unless $s; ++ return $s unless %{$self->{XS}}; ++ ++ my $rebaseverstr = -f '/bin/rebase' ? `/bin/rebase -V 2>&1` : '0'; ++ my ($rebasever) = $rebaseverstr =~ /rebase version ([0-9.]+)/; ++ $rebasever =~ s/(\d\.\d+)\./$1/; ++ if ($rebasever > 3.01) { # new rebase 3.0.2 with database ++ my $INSTALLDIRS = $self->{INSTALLDIRS}; ++ my $INSTALLLIB = $self->{"INSTALL". ($INSTALLDIRS eq 'perl' ? 'ARCHLIB' : uc($INSTALLDIRS)."ARCH")}; ++ my $dll = "$INSTALLLIB/auto/$self->{FULLEXT}/$self->{BASEEXT}.$self->{DLEXT}"; ++ $s =~ s|^(pure_install :: pure_\$\(INSTALLDIRS\)_install\n\t)\$\(NOECHO\) \$\(NOOP\)\n|$1\$(CHMOD) \$(PERM_RWX) \$(DESTDIR)$dll\n\ttest -n "\$(DESTDIR)\" \|\| /bin/rebase -s $dll\n|m; + } + $s; + } diff --git a/perl/pl-CYG08-b722195e_CYG17_utf8_paths.patch b/perl/pl-CYG08-b722195e_CYG17_utf8_paths.patch new file mode 100644 index 0000000..307e0d3 --- /dev/null +++ b/perl/pl-CYG08-b722195e_CYG17_utf8_paths.patch @@ -0,0 +1,375 @@ +From: Reini Urban <ru...@x-...> +Subject: [PATCH] CYG17 utf8 paths +Author: Reini Urban <ru...@x-...> +Date: Tue Apr 12 12:19:36 2011 +0200 +commit b722195e24a6c67310eb30e8f18601966a96ba78 + + CYG17 utf8 paths + + Use cygwin_conv_path since cygwin-1.7 and support native utf-8 paths. + +diff --git a/cygwin/cygwin.c b/cygwin/cygwin.c +index aa6938d..3206f91 100644 +--- a/cygwin/cygwin.c ++++ b/cygwin/cygwin.c +@@ -10,9 +10,13 @@ + #include <unistd.h> + #include <process.h> + #include <sys/cygwin.h> ++#include <cygwin/version.h> + #include <mntent.h> + #include <alloca.h> + #include <dlfcn.h> ++#if (CYGWIN_VERSION_API_MINOR >= 181) ++#include <wchar.h> ++#endif + + /* + * pp_system() implemented via spawn() +@@ -125,7 +129,7 @@ do_spawn (char *cmd) + return do_spawnvp("sh",command); + } + +- Newx (PL_Argv,(s-cmd)/2+2,const char*); ++ Newx (PL_Argv,(s-cmd)/2+2,char*); + PL_Cmd=savepvn (cmd,s-cmd); + a=PL_Argv; + for (s=PL_Cmd; *s;) { +@@ -143,6 +147,44 @@ do_spawn (char *cmd) + return do_spawnvp(PL_Argv[0],(const char * const *)PL_Argv); + } + ++#if (CYGWIN_VERSION_API_MINOR >= 181) ++char* ++wide_to_utf8(const wchar_t *wbuf) ++{ ++ char *buf; ++ int wlen = 0; ++ char *oldlocale = setlocale(LC_CTYPE, NULL); ++ setlocale(LC_CTYPE, "utf-8"); ++ ++ /* uvuni_to_utf8(buf, chr) or Encoding::_bytes_to_utf8(sv, "UCS-2BE"); */ ++ wlen = wcsrtombs(NULL, (const wchar_t **)&wbuf, wlen, NULL); ++ buf = (char *) safemalloc(wlen+1); ++ wcsrtombs(buf, (const wchar_t **)&wbuf, wlen, NULL); ++ ++ if (oldlocale) setlocale(LC_CTYPE, oldlocale); ++ else setlocale(LC_CTYPE, "C"); ++ return buf; ++} ++ ++wchar_t* ++utf8_to_wide(const char *buf) ++{ ++ wchar_t *wbuf; ++ mbstate_t mbs; ++ char *oldlocale = setlocale(LC_CTYPE, NULL); ++ int wlen = sizeof(wchar_t)*strlen(buf); ++ ++ setlocale(LC_CTYPE, "utf-8"); ++ wbuf = (wchar_t *) safemalloc(wlen); ++ /* utf8_to_uvuni(pathname, wpath) or Encoding::_utf8_to_bytes(sv, "UCS-2BE"); */ ++ wlen = mbsrtowcs(wbuf, (const char**)&buf, wlen, &mbs); ++ ++ if (oldlocale) setlocale(LC_CTYPE, oldlocale); ++ else setlocale(LC_CTYPE, "C"); ++ return wbuf; ++} ++#endif /* cygwin 1.7 */ ++ + /* see also Cwd.pm */ + XS(Cygwin_cwd) + { +@@ -194,7 +236,12 @@ XS(XS_Cygwin_winpid_to_pid) + + pid = (pid_t)SvIV(ST(0)); + +- if ((RETVAL = cygwin32_winpid_to_pid(pid)) > 0) { ++#if (CYGWIN_VERSION_API_MINOR >= 181) ++ RETVAL = cygwin_winpid_to_pid(pid); ++#else ++ RETVAL = cygwin32_winpid_to_pid(pid); ++#endif ++ if (RETVAL > 0) { + XSprePUSH; PUSHi((IV)RETVAL); + XSRETURN(1); + } +@@ -202,34 +249,91 @@ XS(XS_Cygwin_winpid_to_pid) + } + + XS(XS_Cygwin_win_to_posix_path) ++ + { + dXSARGS; + int absolute_flag = 0; + STRLEN len; + int err; +- char *pathname, *buf; ++ char *src_path; ++ char *posix_path; ++ int isutf8 = 0; + + if (items < 1 || items > 2) + Perl_croak(aTHX_ "Usage: Cygwin::win_to_posix_path(pathname, [absolute])"); + +- pathname = SvPV(ST(0), len); ++ src_path = SvPV(ST(0), len); + if (items == 2) + absolute_flag = SvTRUE(ST(1)); + + if (!len) + Perl_croak(aTHX_ "can't convert empty path"); +- buf = (char *) safemalloc (len + 260 + 1001); ++ isutf8 = SvUTF8(ST(0)); + ++#if (CYGWIN_VERSION_API_MINOR >= 181) ++ /* Check utf8 flag and use wide api then. ++ Size calculation: On overflow let cygwin_conv_path calculate the final size. ++ */ ++ if (isutf8) { ++ int what = absolute_flag ? CCP_WIN_W_TO_POSIX : CCP_WIN_W_TO_POSIX | CCP_RELATIVE; ++ int wlen = sizeof(wchar_t)*(len + 260 + 1001); ++ wchar_t *wpath = (wchar_t *) safemalloc(sizeof(wchar_t)*len); ++ wchar_t *wbuf = (wchar_t *) safemalloc(wlen); ++ if (!IN_BYTES) { ++ mbstate_t mbs; ++ char *oldlocale = setlocale(LC_CTYPE, NULL); ++ setlocale(LC_CTYPE, "utf-8"); ++ /* utf8_to_uvuni(src_path, wpath) or Encoding::_utf8_to_bytes(sv, "UCS-2BE"); */ ++ wlen = mbsrtowcs(wpath, (const char**)&src_path, wlen, &mbs); ++ if (wlen > 0) ++ err = cygwin_conv_path(what, wpath, wbuf, wlen); ++ if (oldlocale) setlocale(LC_CTYPE, oldlocale); ++ else setlocale(LC_CTYPE, "C"); ++ } else { /* use bytes; assume already ucs-2 encoded bytestream */ ++ err = cygwin_conv_path(what, src_path, wbuf, wlen); ++ } ++ if (err == ENOSPC) { /* our space assumption was wrong, not enough space */ ++ int newlen = cygwin_conv_path(what, wpath, wbuf, 0); ++ wbuf = (wchar_t *) realloc(&wbuf, newlen); ++ err = cygwin_conv_path(what, wpath, wbuf, newlen); ++ wlen = newlen; ++ } ++ /* utf16_to_utf8(*p, *d, bytlen, *newlen) */ ++ posix_path = (char *) safemalloc(wlen*3); ++ Perl_utf16_to_utf8(aTHX_ (U8*)&wpath, (U8*)posix_path, (I32)wlen*2, (I32*)&len); ++ /* ++ wlen = wcsrtombs(NULL, (const wchar_t **)&wbuf, wlen, NULL); ++ posix_path = (char *) safemalloc(wlen+1); ++ wcsrtombs(posix_path, (const wchar_t **)&wbuf, wlen, NULL); ++ */ ++ } else { ++ int what = absolute_flag ? CCP_WIN_A_TO_POSIX : CCP_WIN_A_TO_POSIX | CCP_RELATIVE; ++ posix_path = (char *) safemalloc (len + 260 + 1001); ++ err = cygwin_conv_path(what, src_path, posix_path, len + 260 + 1001); ++ if (err == ENOSPC) { /* our space assumption was wrong, not enough space */ ++ int newlen = cygwin_conv_path(what, src_path, posix_path, 0); ++ posix_path = (char *) realloc(&posix_path, newlen); ++ err = cygwin_conv_path(what, src_path, posix_path, newlen); ++ } ++ } ++#else ++ posix_path = (char *) safemalloc (len + 260 + 1001); + if (absolute_flag) +- err = cygwin_conv_to_full_posix_path(pathname, buf); ++ err = cygwin_conv_to_full_posix_path(src_path, posix_path); + else +- err = cygwin_conv_to_posix_path(pathname, buf); ++ err = cygwin_conv_to_posix_path(src_path, posix_path); ++#endif + if (!err) { +- ST(0) = sv_2mortal(newSVpv(buf, 0)); +- safefree(buf); +- XSRETURN(1); ++ EXTEND(SP, 1); ++ ST(0) = sv_2mortal(newSVpv(posix_path, 0)); ++ if (isutf8) { /* src was utf-8, so result should also */ ++ /* TODO: convert ANSI (local windows encoding) to utf-8 on cygwin-1.5 */ ++ SvUTF8_on(ST(0)); ++ } ++ safefree(posix_path); ++ XSRETURN(1); + } else { +- safefree(buf); ++ safefree(posix_path); + XSRETURN_UNDEF; + } + } +@@ -240,29 +344,80 @@ XS(XS_Cygwin_posix_to_win_path) + int absolute_flag = 0; + STRLEN len; + int err; +- char *pathname, *buf; ++ char *src_path, *win_path; ++ int isutf8 = 0; + + if (items < 1 || items > 2) + Perl_croak(aTHX_ "Usage: Cygwin::posix_to_win_path(pathname, [absolute])"); + +- pathname = SvPV(ST(0), len); ++ src_path = SvPVx(ST(0), len); + if (items == 2) + absolute_flag = SvTRUE(ST(1)); + + if (!len) + Perl_croak(aTHX_ "can't convert empty path"); +- buf = (char *) safemalloc(len + 260 + 1001); +- ++ isutf8 = SvUTF8(ST(0)); ++#if (CYGWIN_VERSION_API_MINOR >= 181) ++ /* Check utf8 flag and use wide api then. ++ Size calculation: On overflow let cygwin_conv_path calculate the final size. ++ */ ++ if (isutf8) { ++ int what = absolute_flag ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_W | CCP_RELATIVE; ++ int wlen = sizeof(wchar_t)*(len + 260 + 1001); ++ wchar_t *wpath = (wchar_t *) safemalloc(sizeof(wchar_t)*len); ++ wchar_t *wbuf = (wchar_t *) safemalloc(wlen); ++ char *oldlocale = setlocale(LC_CTYPE, NULL); ++ setlocale(LC_CTYPE, "utf-8"); ++ if (!IN_BYTES) { ++ mbstate_t mbs; ++ /* utf8_to_uvuni(src_path, wpath) or Encoding::_utf8_to_bytes(sv, "UCS-2BE"); */ ++ wlen = mbsrtowcs(wpath, (const char**)&src_path, wlen, &mbs); ++ if (wlen > 0) ++ err = cygwin_conv_path(what, wpath, wbuf, wlen); ++ } else { /* use bytes; assume already ucs-2 encoded bytestream */ ++ err = cygwin_conv_path(what, src_path, wbuf, wlen); ++ } ++ if (err == ENOSPC) { /* our space assumption was wrong, not enough space */ ++ int newlen = cygwin_conv_path(what, wpath, wbuf, 0); ++ wbuf = (wchar_t *) realloc(&wbuf, newlen); ++ err = cygwin_conv_path(what, wpath, wbuf, newlen); ++ wlen = newlen; ++ } ++ /* also see utf8.c: Perl_utf16_to_utf8() or Encoding::_bytes_to_utf8(sv, "UCS-2BE"); */ ++ wlen = wcsrtombs(NULL, (const wchar_t **)&wbuf, wlen, NULL); ++ win_path = (char *) safemalloc(wlen+1); ++ wcsrtombs(win_path, (const wchar_t **)&wbuf, wlen, NULL); ++ if (oldlocale) setlocale(LC_CTYPE, oldlocale); ++ else setlocale(LC_CTYPE, "C"); ++ } else { ++ int what = absolute_flag ? CCP_POSIX_TO_WIN_A : CCP_POSIX_TO_WIN_A | CCP_RELATIVE; ++ win_path = (char *) safemalloc(len + 260 + 1001); ++ err = cygwin_conv_path(what, src_path, win_path, len + 260 + 1001); ++ if (err == ENOSPC) { /* our space assumption was wrong, not enough space */ ++ int newlen = cygwin_conv_path(what, src_path, win_path, 0); ++ win_path = (char *) realloc(&win_path, newlen); ++ err = cygwin_conv_path(what, src_path, win_path, newlen); ++ } ++ } ++#else ++ if (isutf8) ++ Perl_warn(aTHX_ "can't convert utf8 path"); ++ win_path = (char *) safemalloc(len + 260 + 1001); + if (absolute_flag) +- err = cygwin_conv_to_full_win32_path(pathname, buf); ++ err = cygwin_conv_to_full_win32_path(src_path, win_path); + else +- err = cygwin_conv_to_win32_path(pathname, buf); ++ err = cygwin_conv_to_win32_path(src_path, win_path); ++#endif + if (!err) { +- ST(0) = sv_2mortal(newSVpv(buf, 0)); +- safefree(buf); +- XSRETURN(1); ++ EXTEND(SP, 1); ++ ST(0) = sv_2mortal(newSVpv(win_path, 0)); ++ if (isutf8) { ++ SvUTF8_on(ST(0)); ++ } ++ safefree(win_path); ++ XSRETURN(1); + } else { +- safefree(buf); ++ safefree(win_path); + XSRETURN_UNDEF; + } + } +@@ -293,24 +448,22 @@ XS(XS_Cygwin_mount_flags) + { + dXSARGS; + char *pathname; +- char flags[260]; ++ char flags[PATH_MAX]; ++ flags[0] = '\0'; + + if (items != 1) +- Perl_croak(aTHX_ "Usage: Cygwin::mount_flags(mnt_dir|'/cygwin')"); ++ Perl_croak(aTHX_ "Usage: Cygwin::mount_flags( mnt_dir | '/cygdrive' )"); + + pathname = SvPV_nolen(ST(0)); + +- /* TODO: Check for cygdrive registry setting, +- * and then use CW_GET_CYGDRIVE_INFO +- */ + if (!strcmp(pathname, "/cygdrive")) { +- char user[260]; +- char system[260]; +- char user_flags[260]; +- char system_flags[260]; ++ char user[PATH_MAX]; ++ char system[PATH_MAX]; ++ char user_flags[PATH_MAX]; ++ char system_flags[PATH_MAX]; + +- cygwin_internal (CW_GET_CYGDRIVE_INFO, user, system, user_flags, +- system_flags); ++ cygwin_internal (CW_GET_CYGDRIVE_INFO, user, system, ++ user_flags, system_flags); + + if (strlen(user) > 0) { + sprintf(flags, "%s,cygdrive,%s", user_flags, user); +@@ -323,6 +476,7 @@ XS(XS_Cygwin_mount_flags) + + } else { + struct mntent *mnt; ++ int found = 0; + setmntent (0, 0); + while ((mnt = getmntent (0))) { + if (!strcmp(pathname, mnt->mnt_dir)) { +@@ -331,12 +485,42 @@ XS(XS_Cygwin_mount_flags) + strcat(flags, ","); + strcat(flags, mnt->mnt_opts); + } ++ found++; + break; + } + } + endmntent (0); +- ST(0) = sv_2mortal(newSVpv(flags, 0)); +- XSRETURN(1); ++ ++ /* Check if arg is the current volume moint point if not default, ++ * and then use CW_GET_CYGDRIVE_INFO also. ++ */ ++ if (!found) { ++ char user[PATH_MAX]; ++ char system[PATH_MAX]; ++ char user_flags[PATH_MAX]; ++ char system_flags[PATH_MAX]; ++ ++ cygwin_internal (CW_GET_CYGDRIVE_INFO, user, system, ++ user_flags, system_flags); ++ ++ if (strlen(user) > 0) { ++ if (strcmp(user,pathname)) { ++ sprintf(flags, "%s,cygdrive,%s", user_flags, user); ++ found++; ++ } ++ } else { ++ if (strcmp(user,pathname)) { ++ sprintf(flags, "%s,cygdrive,%s", system_flags, system); ++ found++; ++ } ++ } ++ } ++ if (found) { ++ ST(0) = sv_2mortal(newSVpv(flags, 0)); ++ XSRETURN(1); ++ } else { ++ XSRETURN_UNDEF; ++ } + } + } + diff --git a/perl/pl-CYG10-95f6fab9_skip_testing_cygwin_utf8_readdir_with_Win32_ANSI_API.patch b/perl/pl-CYG10-95f6fab9_skip_testing_cygwin_utf8_readdir_with_Win32_ANSI_API.patch new file mode 100644 index 0000000..b6a1ccf --- /dev/null +++ b/perl/pl-CYG10-95f6fab9_skip_testing_cygwin_utf8_readdir_with_Win32_ANSI_API.patch @@ -0,0 +1,183 @@ +From: Reini Urban <ru...@x-...> +Subject: [PATCH] skip testing cygwin utf8 readdir() with Win32 ANSI API +Author: Reini Urban <ru...@x-...> +Date: Tue Apr 12 12:29:30 2011 +0200 + +diff --git a/cpan/Win32/t/Unicode.t b/cpan/Win32/t/Unicode.t +index 3570142..154372b 100644 +--- a/cpan/Win32/t/Unicode.t ++++ b/cpan/Win32/t/Unicode.t +@@ -1,85 +1,88 @@ +-use strict; +-use Test; +-use Cwd qw(cwd); +-use Win32; +- +-BEGIN { +- unless (defined &Win32::BuildNumber && Win32::BuildNumber() >= 820 or $] >= 5.008009) { +- print "1..0 # Skip: Needs ActivePerl 820 or Perl 5.8.9 or later\n"; +- exit 0; +- } +- if ((((Win32::FsType())[1] & 4) == 0) || (Win32::FsType() =~ /^FAT/)) { +- print "1..0 # Skip: Filesystem doesn't support Unicode\n"; +- exit 0; +- } +- unless ((Win32::GetOSVersion())[1] > 4) { +- print "1..0 # Skip: Unicode support requires Windows 2000 or later\n"; +- exit 0; +- } +-} +- +-my $home = Win32::GetCwd(); +-my $cwd = cwd(); # may be a Cygwin path +-my $dir = "Foo \x{394}\x{419} Bar \x{5E7}\x{645} Baz"; +-my $file = "$dir\\xyzzy \x{394}\x{419} plugh \x{5E7}\x{645}"; +- +-sub cleanup { +- chdir($home); +- my $ansi = Win32::GetANSIPathName($file); +- unlink($ansi) if -f $ansi; +- $ansi = Win32::GetANSIPathName($dir); +- rmdir($ansi) if -d $ansi; +-} +- +-cleanup(); +-END { cleanup() } +- +-plan test => 12; +- +-# Create Unicode directory +-Win32::CreateDirectory($dir); +-ok(-d Win32::GetANSIPathName($dir)); +- +-# Create Unicode file +-Win32::CreateFile($file); +-ok(-f Win32::GetANSIPathName($file)); +- +-# readdir() returns ANSI form of Unicode filename +-ok(opendir(my $dh, Win32::GetANSIPathName($dir))); +-while ($_ = readdir($dh)) { +- next if /^\./; +- ok($file, Win32::GetLongPathName("$dir\\$_")); +-} +-closedir($dh); +- +-# Win32::GetLongPathName() of the absolute path restores the Unicode dir name +-my $full = Win32::GetFullPathName($dir); +-my $long = Win32::GetLongPathName($full); +- +-ok($long, Win32::GetLongPathName($home)."\\$dir"); +- +-# We can Win32::SetCwd() into the Unicode directory +-ok(Win32::SetCwd($dir)); +- +-my $w32dir = Win32::GetCwd(); +-# cwd() also returns a usable ANSI directory name +-my $subdir = cwd(); +- +-# change back to home directory to make sure relative paths +-# in @INC continue to work +-ok(chdir($home)); +-ok(Win32::GetCwd(), $home); +- +-ok(Win32::GetLongPathName($w32dir), $long); +- +-# cwd() on Cygwin returns a mapped path that we need to translate +-# back to a Windows path. Invoking `cygpath` on $subdir doesn't work. +-if ($^O eq "cygwin") { +- $subdir = Cygwin::posix_to_win_path($subdir, 1); +-} +-$subdir =~ s,/,\\,g; +-ok(Win32::GetLongPathName($subdir), $long); +- +-# We can chdir() into the Unicode directory if we use the ANSI name +-ok(chdir(Win32::GetANSIPathName($dir))); +-ok(Win32::GetLongPathName(Win32::GetCwd()), $long); ++use strict; ++use Test; ++use Cwd qw(cwd); ++use Config qw(%Config); ++use Win32; ++ ++BEGIN { ++ unless (defined &Win32::BuildNumber && Win32::BuildNumber() >= 820 or $] >= 5.008009) { ++ print "1..0 # Skip: Needs ActivePerl 820 or Perl 5.8.9 or later\n"; ++ exit 0; ++ } ++ if ((((Win32::FsType())[1] & 4) == 0) || (Win32::FsType() =~ /^FAT/)) { ++ print "1..0 # Skip: Filesystem doesn't support Unicode\n"; ++ exit 0; ++ } ++ unless ((Win32::GetOSVersion())[1] > 4) { ++ print "1..0 # Skip: Unicode support requires Windows 2000 or later\n"; ++ exit 0; ++ } ++} ++ ++my $home = Win32::GetCwd(); ++my $cwd = cwd(); # may be a Cygwin path ++my $dir = "Foo \x{394}\x{419} Bar \x{5E7}\x{645} Baz"; ++my $file = "$dir\\xyzzy \x{394}\x{419} plugh \x{5E7}\x{645}"; ++ ++sub cleanup { ++ chdir($home); ++ my $ansi = Win32::GetANSIPathName($file); ++ unlink($ansi) if -f $ansi; ++ $ansi = Win32::GetANSIPathName($dir); ++ rmdir($ansi) if -d $ansi; ++} ++ ++cleanup(); ++END { cleanup() } ++ ++plan test => 12; ++ ++# Create Unicode directory ++Win32::CreateDirectory($dir); ++ok(-d Win32::GetANSIPathName($dir)); ++ ++# Create Unicode file ++Win32::CreateFile($file); ++ok(-f Win32::GetANSIPathName($file)); ++ ++# readdir() returns ANSI form of Unicode filename ++# but on cygwin-1.7 the utf-8 form. ++ok(opendir(my $dh, Win32::GetANSIPathName($dir))); ++while ($_ = readdir($dh)) { ++ next if /^\./; ++ skip($^O eq 'cygwin' and $Config{osvers} ge "1.7" ? "do not test cygwin utf8 readdir()" : 0, ++ $file, Win32::GetLongPathName("$dir\\$_")); ++} ++closedir($dh); ++ ++# Win32::GetLongPathName() of the absolute path restores the Unicode dir name ++my $full = Win32::GetFullPathName($dir); ++my $long = Win32::GetLongPathName($full); ++ ++ok($long, Win32::GetLongPathName($home)."\\$dir"); ++ ++# We can Win32::SetCwd() into the Unicode directory ++ok(Win32::SetCwd($dir)); ++ ++my $w32dir = Win32::GetCwd(); ++# cwd() also returns a usable ANSI directory name ++my $subdir = cwd(); ++ ++# change back to home directory to make sure relative paths ++# in @INC continue to work ++ok(chdir($home)); ++ok(Win32::GetCwd(), $home); ++ ++ok(Win32::GetLongPathName($w32dir), $long); ++ ++# cwd() on Cygwin returns a mapped path that we need to translate ++# back to a Windows path. Invoking `cygpath` on $subdir doesn't work. ++if ($^O eq "cygwin") { ++ $subdir = Cygwin::posix_to_win_path($subdir, 1); ++} ++$subdir =~ s,/,\\,g; ++ok(Win32::GetLongPathName($subdir), $long); ++ ++# We can chdir() into the Unicode directory if we use the ANSI name ++ok(chdir(Win32::GetANSIPathName($dir))); ++ok(Win32::GetLongPathName(Win32::GetCwd()), $long); diff --git a/perl/pl-CYG11-fabf0235_Fix_test_50_on_cygwin_WINDOWS.patch b/perl/pl-CYG11-fabf0235_Fix_test_50_on_cygwin_WINDOWS.patch new file mode 100644 index 0000000..6da22e6 --- /dev/null +++ b/perl/pl-CYG11-fabf0235_Fix_test_50_on_cygwin_WINDOWS.patch @@ -0,0 +1,39 @@ +commit fabf0235d1f46ea9484846b2c6792dd1182f54a2 +Author: Reini Urban <ru...@x-...> +Date: Tue Apr 12 12:33:16 2011 +0200 + + Fix test 50 on cygwin: \WINDOWS + +diff --git a/cpan/Win32API-File/t/file.t b/cpan/Win32API-File/t/file.t +index 0039b57..9a0dd88 100644 +--- a/cpan/Win32API-File/t/file.t ++++ b/cpan/Win32API-File/t/file.t +@@ -24,7 +24,7 @@ END {print "not ok 1\n" unless $loaded;} + # the ../lib directory in @INC will no longer work once + # we chdir() into the TEMP directory. + +-require Win32 unless defined &Win32::FormatMessage; ++use Win32; + use File::Spec; + use Carp; + use Carp::Heavy; +@@ -342,8 +342,9 @@ if( !$ok ) { + } + print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 49 + +-$ok= -f $let.substr($ENV{WINDIR},3)."/win.ini"; +-$ok or print "# ",fileLastError(),"\n"; ++my $path = $ENV{WINDIR}; ++$ok= -f $let.substr($path,$^O eq 'cygwin'?2:3)."/win.ini"; ++$ok or print "# ",$let.substr($path,3)."/win.ini ",fileLastError(),"\n"; + print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 50 + + $ok= DefineDosDevice( DDD_REMOVE_DEFINITION|DDD_EXACT_MATCH_ON_REMOVE +@@ -351,7 +352,6 @@ $ok= DefineDosDevice( DDD_REMOVE_DEFINITION|DDD_EXACT_MATCH_ON_REMOVE + $ok or print "# $let,$dev: ",fileLastError(),"\n"; + print $ok ? "" : "not ", "ok ", ++$test, "\n"; # ok 51 + +-my $path = $ENV{WINDIR}; + my $attrs = GetFileAttributes( $path ); + $ok= $attrs != INVALID_FILE_ATTRIBUTES; + $ok or print "# $path gave invalid attribute value, attrs=$attrs: ",fileLastError(),"\n"; diff --git a/perl/pl-CYG12-3691eaa7_Export_store_cop_label_for_the_perl_compiler.patch b/perl/pl-CYG12-3691eaa7_Export_store_cop_label_for_the_perl_compiler.patch new file mode 100644 index 0000000..1ea4c5e --- /dev/null +++ b/perl/pl-CYG12-3691eaa7_Export_store_cop_label_for_the_perl_compiler.patch @@ -0,0 +1,107 @@ +commit 3691eaa79cc6a196b6a424b4c7abc6c8f5a481e2 +Author: Reini Urban <ru...@x-...> +Date: Tue Apr 12 14:14:01 2011 +0200 + + Export store_cop_label for the perl compiler + +diff --git a/embed.fnc b/embed.fnc +index b891b43..9067a89 100644 +--- a/embed.fnc ++++ b/embed.fnc +@@ -2440,8 +2440,8 @@ Apon |void |sys_init3 |NN int* argc|NN char*** argv|NN char*** env + Apon |void |sys_term + ApoM |const char *|fetch_cop_label|NN COP *const cop \ + |NULLOK STRLEN *len|NULLOK U32 *flags +-: Only used in op.c +-xpoM |void|store_cop_label \ ++: Only used in op.c and the perl compiler ++EXpoM |void|store_cop_label \ + |NN COP *const cop|NN const char *label|STRLEN len|U32 flags + + xpo |int |keyword_plugin_standard|NN char* keyword_ptr|STRLEN keyword_len|NN OP** op_ptr +diff --git a/ext/XS-APItest/APItest.xs b/ext/XS-APItest/APItest.xs +index 0ce4d51..4298e7d 100644 +--- a/ext/XS-APItest/APItest.xs ++++ b/ext/XS-APItest/APItest.xs +@@ -2328,6 +2328,26 @@ test_cophh() + #undef msvpvs + #undef msviv + ++void ++test_coplabel() ++ PREINIT: ++ COP *cop; ++ char *label; ++ int len, utf8; ++ CODE: ++ cop = &PL_compiling; ++ Perl_store_cop_label(aTHX_ cop, "foo", 3, 0); ++ label = Perl_fetch_cop_label(aTHX_ cop, &len, &utf8); ++ if (strcmp(label,"foo")) croak("fail # fetch_cop_label label"); ++ if (len != 3) croak("fail # fetch_cop_label len"); ++ if (utf8) croak("fail # fetch_cop_label utf8"); ++ Perl_store_cop_label(aTHX_ cop, "foä", 3, SVf_UTF8); ++ label = Perl_fetch_cop_label(aTHX_ cop, &len, &utf8); ++ if (strcmp(label,"foä")) croak("fail # fetch_cop_label label"); ++ if (len != 3) croak("fail # fetch_cop_label len"); ++ if (!utf8) croak("fail # fetch_cop_label utf8"); ++ ++ + HV * + example_cophh_2hv() + PREINIT: +diff --git a/ext/XS-APItest/t/coplabel.t b/ext/XS-APItest/t/coplabel.t +new file mode 100644 +index 0000000..8f0e0e3 +--- /dev/null ++++ b/ext/XS-APItest/t/coplabel.t +@@ -0,0 +1,10 @@ ++use warnings; ++use strict; ++use Test::More tests => 1; ++ ++use XS::APItest; ++ ++XS::APItest::test_coplabel(); ++ok 1; ++ ++1; +diff --git a/global.sym b/global.sym +old mode 100644 +new mode 100755 +diff --git a/hv.c b/hv.c +index ed5061f..e0ea3e2 100644 +--- a/hv.c ++++ b/hv.c +@@ -3391,6 +3391,15 @@ Perl_refcounted_he_inc(pTHX_ struct refcounted_he *he) + return he; + } + ++/* ++=for apidoc fetch_cop_label ++ ++Returns the label attached to a cop. ++The flags pointer may be set to C<SVf_UTF8> or 0. ++ ++=cut ++*/ ++ + /* pp_entereval is aware that labels are stored with a key ':' at the top of + the linked list. */ + const char * +@@ -3427,6 +3436,15 @@ Perl_fetch_cop_label(pTHX_ COP *const cop, STRLEN *len, U32 *flags) { + return chain->refcounted_he_data + 1; + } + ++/* ++=for apidoc store_cop_label ++ ++Save a label into a C<cop_hints_hash>. You need to set flags to C<SVf_UTF8> ++for a utf-8 label. ++ ++=cut ++*/ ++ + void + Perl_store_cop_label(pTHX_ COP *const cop, const char *label, STRLEN len, + U32 flags) diff --git a/perl/pl-CYG13-31abdf84_APItest_coplabel_fix_warnings.patch b/perl/pl-CYG13-31abdf84_APItest_coplabel_fix_warnings.patch new file mode 100644 index 0000000..6158821 --- /dev/null +++ b/perl/pl-CYG13-31abdf84_APItest_coplabel_fix_warnings.patch @@ -0,0 +1,19 @@ +commit 31abdf84ad3d78de345ff0851a765076f87b01e5 +Author: Reini Urban <ru...@x-...> +Date: Tue Apr 12 14:27:18 2011 +0200 + + APItest coplabel: fix warnings + +diff --git a/ext/XS-APItest/APItest.xs b/ext/XS-APItest/APItest.xs +index 4298e7d..4efb22b 100644 +--- a/ext/XS-APItest/APItest.xs ++++ b/ext/XS-APItest/APItest.xs +@@ -2333,7 +2333,7 @@ test_coplabel() + PREINIT: + COP *cop; + char *label; +- int len, utf8; ++ STRLEN len; U32 utf8; + CODE: + cop = &PL_compiling; + Perl_store_cop_label(aTHX_ cop, "foo", 3, 0); diff --git a/perl/pl-Cygwin-sync_winenv.patch b/perl/pl-Cygwin-sync_winenv.patch new file mode 100644 index 0000000..1384464 --- /dev/null +++ b/perl/pl-Cygwin-sync_winenv.patch @@ -0,0 +1,314 @@ +commit a994b04e42ae3d8b8eccbbd85c6ac73f762a2acf +Author: Reini Urban <ru...@x-...> +Date: Wed Feb 8 12:41:45 2012 -0600 + + added Cygwin::sync_winenv. Revise cygwin POD + + Cygwin::sync_winenv should fix [CPAN #65052], ADODB missing + %COMMONPROGRAMFILES%. + sync_winenv code and solution by Chris Day. + +diff --git a/README.cygwin b/README.cygwin +index 0888140..910b3fb 100644 +--- a/README.cygwin ++++ b/README.cygwin +@@ -1,5 +1,5 @@ + If you read this file _as_is_, just ignore the funny characters you +-see. It is written in the POD format (see pod/perlpod.pod) which is ++see. It is written in the POD format (see F<pod/perlpod.pod>) which is + specially designed to be readable as is. + + =head1 NAME +@@ -31,7 +31,7 @@ L<http://www.cygwin.com/> + + A recent net or commercial release of Cygwin is required. + +-At the time this document was last updated, Cygwin 1.5.24 was current. ++At the time this document was last updated, Cygwin 1.7.10 was current. + + + =head2 Cygwin Configuration +@@ -41,8 +41,8 @@ that Perl builds cleanly. These changes are B<not> required for normal + Perl usage. + + B<NOTE:> The binaries that are built will run on all Win32 versions. +-They do not depend on your host system (Win9x/WinME, WinNT/Win2K) +-or your Cygwin configuration (I<ntea>, I<ntsec>, binary/text mounts). ++They do not depend on your host system (WinXP/Win2K/Win7) or your ++Cygwin configuration (binary/text mounts, cvgserver). + The only dependencies come from hard-coded pathnames like C</usr/local>. + However, your host system and Cygwin configuration will affect Perl's + runtime behavior (see L</"TEST">). +@@ -52,7 +52,7 @@ runtime behavior (see L</"TEST">). + =item * C<PATH> + + Set the C<PATH> environment variable so that Configure finds the Cygwin +-versions of programs. Any Windows directories should be removed or ++versions of programs. Any not-needed Windows directories should be removed or + moved to the end of your C<PATH>. + + =item * I<nroff> +@@ -60,28 +60,13 @@ moved to the end of your C<PATH>. + If you do not have I<nroff> (which is part of the I<groff> package), + Configure will B<not> prompt you to install I<man> pages. + +-=item * Permissions +- +-On WinNT with either the I<ntea> or I<ntsec> C<CYGWIN> settings, directory +-and file permissions may not be set correctly. Since the build process +-creates directories and files, to be safe you may want to run a +-C<chmod -R +w *> on the entire Perl source tree. +- +-Also, it is a well known WinNT "feature" that files created by a login +-that is a member of the I<Administrators> group will be owned by the +-I<Administrators> group. Depending on your umask, you may find that you +-can not write to files that you just created (because you are no longer +-the owner). When using the I<ntsec> C<CYGWIN> setting, this is not an +-issue because it "corrects" the ownership to what you would expect on +-a UNIX system. +- + =back + + =head1 CONFIGURE PERL ON CYGWIN + + The default options gathered by Configure with the assistance of + F<hints/cygwin.sh> will build a Perl that supports dynamic loading +-(which requires a shared F<libperl.dll>). ++(which requires a shared F<cygperl5_16.dll>). + + This will run Configure and keep a record: + +@@ -122,17 +107,6 @@ DES crypt port by Corinna Vinschen. + + Alternatively, the crypt libraries in GNU libc have been ported to Cygwin. + +-The DES based Ultra Fast Crypt port was done by Alexey Truhan: +- +- ftp://ftp.franken.de/pub/win32/develop/gnuwin32/cygwin/porters/Okhapkin_Sergey/cw32crypt-dist-0.tgz +- +-NOTE: There are various export restrictions on DES implementations, +-see the glibc README for more details. +- +-The MD5 port was done by Andy Piper: +- +- ftp://ftp.franken.de/pub/win32/develop/gnuwin32/cygwin/porters/Okhapkin_Sergey/libcrypt.tgz +- + =item * C<-lgdbm_compat> (C<use GDBM_File>) + + GDBM is available for Cygwin. +@@ -143,8 +117,7 @@ NOTE: The GDBM library only works on NTFS partitions. + + BerkeleyDB is available for Cygwin. + +-NOTE: The BerkeleyDB library only completely works on NTFS partitions +-and db-4.3 is flawed. ++NOTE: The BerkeleyDB library only completely works on NTFS partitions. + + =item * C<cygserver> (C<use IPC::SysV>) + +@@ -177,10 +150,11 @@ prompts you or you can define (undefine) symbols on the command line. + + Undefining this symbol forces Perl to be compiled statically. + +-=item * C<-Uusemymalloc> ++=item * C<-Dusemymalloc> + +-By default Perl uses the C<malloc()> included with the Perl source. If you +-want to force Perl to build with the system C<malloc()> undefine this symbol. ++By default Perl does not use the C<malloc()> included with the Perl source, ++because it was slower and not entirely thread-safe. If you want to force ++Perl to build with the old -Dusemymalloc define this. + + =item * C<-Uuseperlio> + +@@ -190,12 +164,13 @@ default; it is not recommended to disable PerlIO. + =item * C<-Dusemultiplicity> + + Multiplicity is required when embedding Perl in a C program and using +-more than one interpreter instance. This works with the Cygwin port. ++more than one interpreter instance. This is only required when you build ++a not-threaded perl with C<-Uuseithreads>. + +-=item * C<-Duse64bitint> ++=item * C<-Uuse64bitint> + +-By default Perl uses 32 bit integers. If you want to use larger 64 +-bit integers, define this symbol. ++By default Perl uses 64 bit integers. If you want to use smaller 32 bit ++integers, define this symbol. + + =item * C<-Duselongdouble> + +@@ -203,12 +178,11 @@ I<gcc> supports long doubles (12 bytes). However, several additional + long double math functions are necessary to use them within Perl + (I<{atan2, cos, exp, floor, fmod, frexp, isnan, log, modf, pow, sin, sqrt}l, + strtold>). +-These are B<not> yet available with Cygwin. ++These are B<not> yet available with newlib, the Cygwin libc. + +-=item * C<-Dusethreads> ++=item * C<-Uuseithreads> + +-POSIX threads are implemented in Cygwin, define this symbol if you want +-a threaded perl. ++Define this symbol if you want not-threaded faster perl. + + =item * C<-Duselargefiles> + +@@ -217,9 +191,9 @@ this will be correctly detected and defined by Configure. + + =item * C<-Dmksymlinks> + +-Use this to build perl outside of the source tree. This works with Cygwin. +-Details can be found in the F<INSTALL> document. This is the recommended +-way to build perl from sources. ++Use this to build perl outside of the source tree. Details can be ++found in the F<INSTALL> document. This is the recommended way to ++build perl from sources. + + =back + +@@ -349,29 +323,25 @@ to portability, more information can be found in the Cygwin documentation. + + =item * Pathnames + +-Cygwin pathnames can be separated by forward (F</>) or backward (F<\\>) +-slashes. They may also begin with drive letters (F<C:>) or Universal +-Naming Codes (F<//UNC>). DOS device names (F<aux>, F<con>, F<prn>, +-F<com*>, F<lpt?>, F<nul>) are invalid as base filenames. However, they +-can be used in extensions (e.g., F<hello.aux>). Names may contain all +-printable characters except these: +- +- : * ? " < > | ++Cygwin pathnames are separated by forward (F</>) slashes, Universal ++Naming Codes (F<//UNC>) are also supported Since cygwin-1.7 non-POSIX ++pathnames are disencouraged. Names may contain all printable ++characters. + + File names are case insensitive, but case preserving. A pathname that +-contains a backslash or drive letter is a Win32 pathname (and not subject +-to the translations applied to POSIX style pathnames). ++contains a backslash or drive letter is a Win32 pathname, and not ++subject to the translations applied to POSIX style pathnames, but ++cygwin will warn you, so better convert them to POSIX. + + For conversion we have C<Cygwin::win_to_posix_path()> and + C<Cygwin::posix_to_win_path()>. + +-Pathnames may not contain Unicode characters. C<Cygwin> still uses the +-ANSI API calls and no Unicode calls because of newlib deficiencies. +-There's an unofficial unicode patch for cygwin at +-L<http://www.okisoft.co.jp/esc/utf8-cygwin/> ++Since cygwin-1.7 pathnames are UTF-8 encoded. + + =item * Text/Binary + ++Since cywgin-1.7 textmounts are deprecated and stronlgy discouraged. ++ + When a file is opened it is in either text or binary mode. In text mode + a file is subject to CR/LF/Ctrl-Z translations. With Cygwin, the default + mode for an C<open()> is determined by the mode of the mount that underlies +@@ -411,8 +381,8 @@ extension transparent by looking for F<foo.exe> when you ask for F<foo> + (unless a F<foo> also exists). Cygwin does not require a F<.exe> + extension, but I<gcc> adds it automatically when building a program. + However, when accessing an executable as a normal file (e.g., I<cp> +-in a makefile) the F<.exe> is not transparent. The I<install> included +-with Cygwin automatically appends a F<.exe> when necessary. ++in a makefile) the F<.exe> is not transparent. The I<install> program ++included with Cygwin automatically appends a F<.exe> when necessary. + + =item * Cygwin vs. Windows process ids + +@@ -428,6 +398,28 @@ to translate between them. + Under Cygwin, $^E is the same as $!. When using L<Win32 API Functions|Win32>, + use C<Win32::GetLastError()> to get the last Windows error. + ++=item * rebase errors on fork or system ++ ++Using C<fork()> or C<system()> out to another perl after loading multiple dlls ++may result on a DLL baseaddress conflict. The internal cygwin error ++looks like like the following: ++ ++ C:\CYGWIN\BIN\PERL.EXE: *** couldn't allocate memory 0x10000(4128768) for 'C:\CYGWIN\LIB\PERL5\5.6.1\CYGWIN-MULTI\AUTO\SOCKET\SOCKET.DLL' alignment, Win32 error 8 ++ ++ 200 [main] perl 377147 sync_with_child: child -395691(0xB8) died before initialization with status code 0x1 ++ 1370 [main] perl 377147 sync_with_child: *** child state child loading dlls ++ ++It helps if not too many DLLs are loaded in memory so the available address space is larger, ++e.g. stopping the MS Internet Explorer might help. ++ ++Use the perlrebase or rebase utilities to resolve the conflicting dll addresses. ++The rebase package is included in the Cygwin setup. Use F<setup.exe> ++from L<http://www.cygwin.com/setup.exe> to install it. ++ ++1. kill all perl processes and run C<perlrebase> or ++ ++2. kill all cygwin processes and services, start dash from cmd.exe and run C<rebaseall>. ++ + =item * C<chown()> + + On WinNT C<chown()> can change a file's user and group IDs. On Win9x C<chown()> +@@ -448,18 +440,6 @@ of the file being edited C<perl -i.bak> because of windowish restrictions, + therefore Perl adds the suffix C<.bak> automatically if you use C<perl -i> + without specifying a backup extension. + +-Using C<fork()> after loading multiple dlls may fail with an internal cygwin +-error like the following: +- +- C:\CYGWIN\BIN\PERL.EXE: *** couldn't allocate memory 0x10000(4128768) for 'C:\CYGWIN\LIB\PERL5\5.6.1\CYGWIN-MULTI\AUTO\SOCKET\SOCKET.DLL' alignment, Win32 error 8 +- +- 200 [main] perl 377147 sync_with_child: child -395691(0xB8) died before initialization with status code 0x1 +- 1370 [main] perl 377147 sync_with_child: *** child state child loading dlls +- +-Use the rebase utility to resolve the conflicting dll addresses. The +-rebase package is included in the Cygwin netrelease. Use setup.exe from +-L<http://www.cygwin.com/setup.exe> to install it and run rebaseall. +- + =back + + =head2 Prebuilt methods: +@@ -529,6 +509,17 @@ User mounts override system mounts. + Returns true if the given cygwin path is binary mounted, false if the + path is mounted in textmode. + ++=item C<Cygwin::sync_winenv> ++ ++Cygwin does not initialize all original Win32 environment variables. ++See the bottom of this page L<http://cygwin.com/cygwin-ug-net/setup-env.html> ++for "Restricted Win32 environment". ++ ++Certain Win32 programs called from cygwin program might need some environment ++variable, such as e.g. ADODB needs %COMMONPROGRAMFILES%. ++Call Cygwin::sync_winenv() to copy all Win32 environment variables to your ++process and note that cygwin will warn on every encounter of non-POSIX paths. ++ + =back + + =head1 INSTALL PERL ON CYGWIN +@@ -781,4 +772,4 @@ Jerry D. Hedden <jdh...@cp...>. + + =head1 HISTORY + +-Last updated: 2007-09-25 ++Last updated: 2012-02-08 +diff --git a/cygwin/cygwin.c b/cygwin/cygwin.c +index 0f5fe1d..9419e83 100644 +--- a/cygwin/cygwin.c ++++ b/cygwin/cygwin.c +@@ -538,6 +538,8 @@ XS(XS_Cygwin_is_binmount) + XSRETURN(1); + } + ++XS(XS_Cygwin_sync_winenv){ cygwin_internal(CW_SYNC_WINENV); } ++ + void + init_os_extras(void) + { +@@ -553,6 +555,7 @@ init_os_extras(void) + newXSproto("Cygwin::mount_table", XS_Cygwin_mount_table, file, ""); + newXSproto("Cygwin::mount_flags", XS_Cygwin_mount_flags, file, "$"); + newXSproto("Cygwin::is_binmount", XS_Cygwin_is_binmount, file, "$"); ++ newXS("Cygwin::sync_winenv", XS_Cygwin_sync_winenv, file); + + /* Initialize Win32CORE if it has been statically linked. */ + handle = dlopen(NULL, RTLD_LAZY); diff --git a/perl/pl-commit-0c612ce.patch b/perl/pl-commit-0c612ce.patch new file mode 100644 index 0000000..e7edaea --- /dev/null +++ b/perl/pl-commit-0c612ce.patch @@ -0,0 +1,41 @@ +commit 0c612ce8203a9badc077399e8421a9a0e5183a94 +Author: Reini Urban <ru...@x-...> +Date: Fri Dec 17 11:02:08 2010 +0100 + + Fix building static extensions on cygwin, -UUSEIMPORTLIB + + Similar to the outstanding Dynaloader problem + undefined reference to `__imp__PL_stack_sp' + when linking against the static libperl.a, not against the .dll.a importlib, + the same problem remains for all other static core extensions (tested with Cwd) + so fix it at the central place for LINKTYPE=static. + +diff -u perl-5.14.2/make_ext.pl.orig perl-5.14.2/make_ext.pl +--- perl-5.14.2/make_ext.pl.orig 2011-09-26 04:44:34.000000000 -0500 ++++ perl-5.14.2/make_ext.pl 2012-03-20 10:02:06.156250000 -0500 +@@ -286,7 +286,7 @@ + } else { + $makefile = 'Makefile'; + } +- ++ + if (!-f $makefile) { + if (!-f 'Makefile.PL') { + print "\nCreating Makefile.PL in $ext_dir for $mname\n"; +@@ -373,6 +373,16 @@ + ) : ()), + ); + ++sub MY::cflags { ++ package MY; ++ my $flags = $_[0]->SUPER::cflags(@_); ++ my $linktype = $_[0]->{LINKTYPE}; ++ if ($linktype eq 'static' and $flags =~ /-DUSEIMPORTLIB/m) { ++ $flags =~ s/-DUSEIMPORTLIB/-UUSEIMPORTLIB/m; ++ } ++ $flags; ++} ++ + # ex: set ro: + EOM + close $fh or die "Can't close Makefile.PL: $!"; diff --git a/perl/pl-commit-1bac5ec.patch b/perl/pl-commit-1bac5ec.patch new file mode 100644 index 0000000..61bcf30 --- /dev/null +++ b/perl/pl-commit-1bac5ec.patch @@ -0,0 +1,33 @@ +commit 1bac5ecc108e6bb05752e5aef66c6890163aff39 +Author: Brian Fraser <fra...@gm...> +Date: Mon Sep 26 13:48:52 2011 -0700 + + sv.c: S_anonymise_cv_maybe UTF8 cleanup. + +diff --git a/sv.c b/sv.c +index d71f901..a3a2c74 100644 +--- a/sv.c ++++ b/sv.c +@@ -5893,7 +5893,6 @@ Perl_sv_replace(pTHX_ register SV *const sv, register SV *const nsv) + STATIC void + S_anonymise_cv_maybe(pTHX_ GV *gv, CV* cv) + { +- char *stash; + SV *gvname; + GV *anongv; + +@@ -5913,10 +5912,10 @@ S_anonymise_cv_maybe(pTHX_ GV *gv, CV* cv) + } + + /* if not, anonymise: */ +- stash = GvSTASH(gv) && HvNAME(GvSTASH(gv)) +- ? HvENAME(GvSTASH(gv)) : NULL; +- gvname = Perl_newSVpvf(aTHX_ "%s::__ANON__", +- stash ? stash : "__ANON__"); ++ gvname = (GvSTASH(gv) && HvNAME(GvSTASH(gv)) && HvENAME(GvSTASH(gv))) ++ ? newSVhek(HvENAME_HEK(GvSTASH(gv))) ++ : newSVpvn_flags( "__ANON__", 8, 0 ); ++ sv_catpvs(gvname, "::__ANON__"); + anongv = gv_fetchsv(gvname, GV_ADDMULTI, SVt_PVCV); + SvREFCNT_dec(gvname); + diff --git a/perl/pl-cygwin-auto-image-base.patch b/perl/pl-cygwin-auto-image-base.patch new file mode 100644 index 0000000..44f1a40 --- /dev/null +++ b/perl/pl-cygwin-auto-image-base.patch @@ -0,0 +1,11 @@ +--- origsrc/perl-5.14.4/Makefile.SH 2012-12-19 06:25:23.000000000 -0600 ++++ src/perl-5.14.4/Makefile.SH 2013-03-13 13:03:54.186100300 -0500 +@@ -61,7 +61,7 @@ true) + -install_name \$(shrpdir)/\$@" + ;; + cygwin*) +- shrpldflags="$shrpldflags -Wl,--out-implib=libperl.dll.a -Wl,--image-base,0x52000000" ++ shrpldflags="$shrpldflags -Wl,--out-implib=libperl.dll.a" + linklibperl="-L. -lperl" + ;; + sunos*) diff --git a/perl/pl-cygwin-check-libs.patch b/perl/pl-cygwin-check-libs.patch new file mode 100644 index 0000000..8a7b351 --- /dev/null +++ b/perl/pl-cygwin-check-libs.patch @@ -0,0 +1,14 @@ +--- perl-5.14.4-RC2-1/origsrc/perl-5.14.4-RC2/Configure 2012-12-19 06:25:23.000000000 -0600 ++++ perl-5.14.4-RC2-1/src/perl-5.14.4-RC2/Configure 2013-03-10 22:54:46.714474300 -0500 +@@ -4973,6 +4973,11 @@ for thislib in $libswanted; do + $test -f "$xxx" && libstyle=shared + fi + if test ! -f "$xxx"; then ++ xxx=$thisdir/lib$thislib.dll.a ++ $test -f "$xxx" && eval $libscheck ++ $test -f "$xxx" && libstyle=shared ++ fi ++ if test ! -f "$xxx"; then + xxx=$thisdir/lib$thislib$_a + $test -f "$xxx" && eval $libscheck + $test -f "$xxx" && libstyle=static diff --git a/perl/pl-cygwin_patchlevelh.patch b/perl/pl-cygwin_patchlevelh.patch new file mode 100644 index 0000000..3f14f4b --- /dev/null +++ b/perl/pl-cygwin_patchlevelh.patch @@ -0,0 +1,19 @@ +difforig perl-5.14.2/patchlevel.h + +diff -u perl-5.14.2/patchlevel.h.orig perl-5.14.2/patchlevel.h +--- perl-5.14.2/patchlevel.h.orig 2011-09-26 04:44:34.000000000 -0500 ++++ perl-5.14.2/patchlevel.h 2012-03-20 10:09:37.109375000 -0500 +@@ -137,6 +137,13 @@ + ,"uncommitted-changes" + #endif + PERL_GIT_UNPUSHED_COMMITS /* do not remove this line */ ++ ,"Bug#55162 File::Spec::case_tolerant performance" ++ ,"CYG07 $vendorarch/auto/.rebase" ++ ,"CYG15 static Win32CORE" ++ ,"CYG17 cyg-1.7 paths-utf8" ++ ,"0c612ce82 Fix building static extensions on cygwin, -UUSEIMPORTLIB" ++ ,"1bac5ecc1 Fix 64-bit threading sv.c: S_anonymise_cv_maybe" ++ ,"Cygwin::sync_winenv added" + ,NULL + }; + diff --git a/perl/pl-hints-cygwin.patch b/perl/pl-hints-cygwin.patch new file mode 100644 index 0000000..5add4b0 --- /dev/null +++ b/perl/pl-hints-cygwin.patch @@ -0,0 +1,13 @@ +difforig buildperl/hints/cygwin.sh + +diff -u buildperl/hints/cygwin.sh.orig buildperl/hints/cygwin.sh +--- buildperl/hints/cygwin.sh.orig 2011-09-19 08:18:22.000000000 -0500 ++++ buildperl/hints/cygwin.sh 2012-03-23 09:33:16.687500000 -0500 +@@ -31,6 +31,7 @@ + man3ext='3pm' + test -z "$use64bitint" && use64bitint='define' + test -z "$usethreads" && usethreads='define' ++test -z "$usemymalloc" && usemymalloc='undef' + ccflags="$ccflags -DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__" + # - otherwise i686-cygwin + archname='cygwin' ----------------------------------------------------------------------- Summary of changes: perl/msys2-perl.patch | 131 +++++++ perl/pl-CYG07-cygwin_vendorarchautorebase-2.patch | 129 +++++++ perl/pl-CYG08-b722195e_CYG17_utf8_paths.patch | 375 ++++++++++++++++++++ ...g_cygwin_utf8_readdir_with_Win32_ANSI_API.patch | 183 ++++++++++ ...11-fabf0235_Fix_test_50_on_cygwin_WINDOWS.patch | 39 ++ ...ort_store_cop_label_for_the_perl_compiler.patch | 107 ++++++ ...13-31abdf84_APItest_coplabel_fix_warnings.patch | 19 + perl/pl-Cygwin-sync_winenv.patch | 314 ++++++++++++++++ perl/pl-commit-0c612ce.patch | 41 +++ perl/pl-commit-1bac5ec.patch | 33 ++ perl/pl-cygwin-auto-image-base.patch | 11 + perl/pl-cygwin-check-libs.patch | 14 + perl/pl-cygwin_patchlevelh.patch | 19 + perl/pl-hints-cygwin.patch | 13 + 14 files changed, 1428 insertions(+), 0 deletions(-) create mode 100644 perl/msys2-perl.patch create mode 100644 perl/pl-CYG07-cygwin_vendorarchautorebase-2.patch create mode 100644 perl/pl-CYG08-b722195e_CYG17_utf8_paths.patch create mode 100644 perl/pl-CYG10-95f6fab9_skip_testing_cygwin_utf8_readdir_with_Win32_ANSI_API.patch create mode 100644 perl/pl-CYG11-fabf0235_Fix_test_50_on_cygwin_WINDOWS.patch create mode 100644 perl/pl-CYG12-3691eaa7_Export_store_cop_label_for_the_perl_compiler.patch create mode 100644 perl/pl-CYG13-31abdf84_APItest_coplabel_fix_warnings.patch create mode 100644 perl/pl-Cygwin-sync_winenv.patch create mode 100644 perl/pl-commit-0c612ce.patch create mode 100644 perl/pl-commit-1bac5ec.patch create mode 100644 perl/pl-cygwin-auto-image-base.patch create mode 100644 perl/pl-cygwin-check-libs.patch create mode 100644 perl/pl-cygwin_patchlevelh.patch create mode 100644 perl/pl-hints-cygwin.patch hooks/post-receive -- Repository: msys2-tools |