CBuilder, link: On Android, always return absolute paths to libraries
authorBrian Fraser <fraserbn@gmail.com>
Mon, 3 Feb 2014 20:22:58 +0000 (21:22 +0100)
committerBrian Fraser <fraserbn@gmail.com>
Mon, 3 Feb 2014 21:46:32 +0000 (22:46 +0100)
Several modules on CPAN expect being able to pass the library
name returned by ->link to DynaLoader::dl_load_file and have it Just Work.
However, because ->link returns relative paths, those modules ran afoul
of Android's linker, which will only look in a handful of hardcoded
system directories for relative libraries, plus whatever LD_LIBRARY_PATH
pointed to at the start of execution.

This commit makes ->link on Android always return an absolute path,
which will be found by the linker.

14 files changed:
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Base.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Unix.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/VMS.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows/BCC.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows/GCC.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/Windows/MSVC.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/aix.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/android.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/cygwin.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/darwin.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/dec_osf.pm
dist/ExtUtils-CBuilder/lib/ExtUtils/CBuilder/Platform/os2.pm

index dffec01..1f66c93 100644 (file)
@@ -6,7 +6,7 @@ use File::Basename ();
 use Perl::OSType qw/os_type/;
 
 use vars qw($VERSION @ISA);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 $VERSION = eval $VERSION;
 
 # We only use this once - don't waste a symbol table entry on it.
index 13a1298..c7b1a10 100644 (file)
@@ -10,7 +10,7 @@ use IPC::Cmd qw(can_run);
 use File::Temp qw(tempfile);
 
 use vars qw($VERSION);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 
 # More details about C/C++ compilers:
 # http://developers.sun.com/sunstudio/documentation/product/compiler.jsp
index b287694..2dab172 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use ExtUtils::CBuilder::Base;
 
 use vars qw($VERSION @ISA);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 @ISA = qw(ExtUtils::CBuilder::Base);
 
 sub link_executable {
index 8781d1a..d6d99c6 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use ExtUtils::CBuilder::Base;
 
 use vars qw($VERSION @ISA);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 @ISA = qw(ExtUtils::CBuilder::Base);
 
 use File::Spec::Functions qw(catfile catdir);
index 6b12f55..aea09ba 100644 (file)
@@ -10,7 +10,7 @@ use ExtUtils::CBuilder::Base;
 use IO::File;
 
 use vars qw($VERSION @ISA);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 @ISA = qw(ExtUtils::CBuilder::Base);
 
 =begin comment
index ef038ce..7bf2573 100644 (file)
@@ -1,7 +1,7 @@
 package ExtUtils::CBuilder::Platform::Windows::BCC;
 
 use vars qw($VERSION);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 
 sub format_compiler_cmd {
   my ($self, %spec) = @_;
index 393ccda..2bdb016 100644 (file)
@@ -1,7 +1,7 @@
 package ExtUtils::CBuilder::Platform::Windows::GCC;
 
 use vars qw($VERSION);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 
 sub format_compiler_cmd {
   my ($self, %spec) = @_;
index 490be70..38eb209 100644 (file)
@@ -1,7 +1,7 @@
 package ExtUtils::CBuilder::Platform::Windows::MSVC;
 
 use vars qw($VERSION);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 
 sub arg_exec_file {
   my ($self, $file) = @_;
index 5c414c8..223be29 100644 (file)
@@ -5,7 +5,7 @@ use ExtUtils::CBuilder::Platform::Unix;
 use File::Spec;
 
 use vars qw($VERSION @ISA);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
 
 sub need_prelink { 1 }
index 461d52e..2e56db1 100644 (file)
@@ -5,7 +5,7 @@ use File::Spec;
 use ExtUtils::CBuilder::Platform::Unix;
 
 use vars qw($VERSION @ISA);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
 
 # The Android linker will not recognize symbols from
@@ -21,7 +21,17 @@ sub link {
     ];
   }
 
-  return $self->SUPER::link(%args);
+  # Several modules on CPAN rather rightfully expect being
+  # able to pass $so_file to DynaLoader::dl_load_file and
+  # have it Just Work.  However, $so_file will more likely
+  # than not be a relative path, and unless the module 
+  # author subclasses MakeMaker/Module::Build to modify
+  # LD_LIBRARY_PATH, which would be insane, Android's linker
+  # won't find the .so
+  # So we make this all work by returning an absolute path.
+  my($so_file, @so_tmps) = $self->SUPER::link(%args);
+  $so_file = File::Spec->rel2abs($so_file);
+  return ($so_file, @so_tmps);
 }
 
 1;
index a16fa10..9186fbb 100644 (file)
@@ -5,7 +5,7 @@ use File::Spec;
 use ExtUtils::CBuilder::Platform::Unix;
 
 use vars qw($VERSION @ISA);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
 
 # TODO: If a specific exe_file name is requested, if the exe created
index 68d3a88..e334d91 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use ExtUtils::CBuilder::Platform::Unix;
 
 use vars qw($VERSION @ISA);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
 
 sub compile {
index 49bdb77..ef2d3ee 100644 (file)
@@ -6,7 +6,7 @@ use File::Spec;
 
 use vars qw($VERSION @ISA);
 @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 
 sub link_executable {
   my $self = shift;
index 1efcbc1..5aec8f3 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use ExtUtils::CBuilder::Platform::Unix;
 
 use vars qw($VERSION @ISA);
-$VERSION = '0.280214';
+$VERSION = '0.280215';
 @ISA = qw(ExtUtils::CBuilder::Platform::Unix);
 
 sub need_prelink { 1 }