Mon Jul 11 15:15:22 2016: Request 116056 was acted upon.
Transaction: Ticket created by kbr...@cornell.edu
       Queue: PAR
     Subject: Fixes for Cygwin build of PAR::Packer
   Broken in: (no value)
    Severity: (no value)
       Owner: Nobody
  Requestors: kbr...@cornell.edu
      Status: new
 Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=116056 >


There are two problems with the build of PAR::Packer 1.033 on Cygwin:

1. The build fails with "undefined reference to `__stack_chk_fail'". 
This happens starting with version 1.030 due to the removal of the line

   $boot_ldflags .= $static_ldflags;

from Makefile.PL.  Adding that line back (see the attached 
boot_ldflags.patch) fixes the problem.

2. The method for detecting a 64-bit system in Makefile.PL, based on 
$Config{archname}, doesn't work on 64-bit Cygwin.  Here we have the 
following:

$ perl -e 'use Config; print $Config{archname}'
cygwin-thread-multi

$ perl -e 'use Config; print $Config{myuname}'
cygwin_nt-6.3 cygwin 2.5.1(0.29753) 2016-04-21 22:14 x86_64 cygwin

So PAR::Packer should use myuname on Cygwin instead of archname.  See 
the attached x86_64_cygwin.patch.  (This comes from a patch used by 
Yaakov Selkowitz, the Cygwin maintainer of PAR::Packer.)

Ken

--- origsrc/PAR-Packer-1.033/myldr/Makefile.PL	2016-05-12 03:20:37.000000000 -0400
+++ src/PAR-Packer-1.033/myldr/Makefile.PL	2016-07-11 14:08:53.133669400 -0400
@@ -173,6 +173,7 @@ if ($dynperl) {
     $perllibshortname =~ s/\Q.$so\E$//;
 }
 $static_ldflags =~ s/(^|\s)-l$perllibshortname(\s|$)/ /g;
+$boot_ldflags .= $static_ldflags;
 
 
 # In the $dynperl case, we've already found the $libperl DSO.
--- origsrc/PAR-Packer-1.033/myldr/Makefile.PL	2016-05-12 03:20:37.000000000 -0400
+++ src/PAR-Packer-1.033/myldr/Makefile.PL	2016-07-11 14:59:54.598986100 -0400
@@ -110,7 +110,8 @@ $res:
     $lddebug = ($debug or $^O eq 'darwin') ? '' : '-s ';
     $warn = $debug ? '-Wall -Wno-comments ' : '';
     if ( $^O =~ /^(?:MSWin|cygwin)/ ) {
-        my $target = $Config{archname} =~ /x64/ ? 'pe-x86-64' : 'pe-i386';
+        my $target = $Config{archname} =~ /x64/ || $Config{myuname} =~ /x86_64/
+	  ? 'pe-x86-64' : 'pe-i386';
         $res = 'ppresource.coff';
         # Note: On cygwin the command below will be processed by the
         # cygwin shell, so backslashes in pathnames might be a problem.

Reply via email to