develooper Front page | perl.perl5.porters | Postings from December 2012

JROBINSON grant report, #13

Thread Next
Jess Robinson
December 18, 2012 11:49
JROBINSON grant report, #13
Message ID:

Mornin all,

As you may (or may not) have noticed, James has been working on a  
Java-based backed for Matt's Object::Remote tool (hitting CPAN soon, I'm  
told). In case you haven't, O::R itself is a tool for running Perl code on  
remote servers, expecting nothing but a copy of Perl installed on those  
servers. All the required modules are shipped over to the target server  
using FatPacker. The actual running of the code is done via a JSON based  
protocol which sends instructions like "create a new Widget", "run method  
X on the Widget object", "return results". Only the object IDs are passed  
around, the actual objects stay where they are created..

Anyway, long story short, we have a Java backend that follows the above  
principles, (except for the needing to copy Perl modules about), which we  
can install on Android, and then use Perl (on Android or remotely) to  
implement Android apps. Most of this was not done on grant time, as it was  
a side project.

Last week I did spend some grant time making RunPerl, the small on-Android  
testing app that I built, use Object-Remote-Java, and include a demo  
script that will manipulate the GUI. I also wrote some docs and a blog  
post, to show people what's possible. The post (with links to everything  
else), is at:

This gives a visual demonstration of the uses of all this work and was a  
nice break from grubbing around in Configure.

Matt himself was after trying it out, and is more interested in running  
Perl on his Android device to be able to develop Perl code for other uses.  
He asked me if I could get him DBI and DBD-SQLite compiled/installable. As  
this is something we need a solution for (compiling XS modules for the  
cross-compiled Perl), I did this on grant time as well. Luckily both these  
modules use ExtUtils::MakeMaker, like Perl core, so I just needed to patch  
for the attempts to actually load the (now cross-compiled) on the  
host. This loading was all in aid of retrieving $DBI::VERSION, so I  
patched it to use ExtUtils::MakeMaker's parse_version instead.

These patches are not final, as they assume it's sat in the core cpan/ dir  
and being compiled during Perl core compilation. I suspect some check for  
$Config{usecrosscompile} instead will be better later.

diff -ru ./lib/DBI/  
--- ./lib/DBI/	2012-02-04 20:51:40.000000000 +0000
/usr/src/perl/perl-cross-compile/repo/perl/cpan/DBI/lib/DBI/	2012-12-16  
15:11:29.000000000 +0000
@@ -3283,7 +3283,7 @@

      $is_dbi = (-r '' && -r 'DBI.xs' && -r 'DBIXS.h');
-    require DBI unless $is_dbi;
+    require DBI unless $is_dbi or $ENV{PERL_CORE};

  my $done_inst_checks;
@@ -3437,13 +3437,27 @@
  sub dbd_dbi_arch_dir {
      return '$(INST_ARCHAUTODIR)' if $is_dbi;
-    my $dbidir = dbd_dbi_dir();
      my %seen;
+    my $dbi_version = '';
+    if($ENV{PERL_CORE}) {
+        ## also if($Config{usecrosscompile}) ? - cant load DBI as built  
for other arch.
+        my $updir = File::Spec->updir;
+        my $CORElibdir = File::Spec->catdir(($updir) x 2, 'lib');
+        my $DBI_pm = File::Spec->catfile($CORElibdir, '');
+        my $autoDBIdir = File::Spec->catdir($CORElibdir, 'auto', 'DBI');
+        if(!-d $autoDBIdir) {
+            die "Running under PERL_CORE, can't find $autoDBIdir";
+        }
+        $dbi_version = ExtUtils::MM_Unix->parse_version($DBI_pm);
+    } else {
+        $dbi_version = $DBI::VERSION;
+    }
      my @try = grep { not $seen{$_}++ } map { vmsify( unixify($_) .  
"/auto/DBI/" ) } @INC;
      my @xst = grep { -f vmsify( unixify($_) . "/Driver.xst" ) } @try;
      Carp::croak("Unable to locate Driver.xst in @try") unless @xst;
      Carp::carp( "Multiple copies of Driver.xst found in: @xst") if @xst >  
-    print "Using DBI $DBI::VERSION (for perl $] on $Config{archname})  
installed in $xst[0]\n";
+    print "Using DBI $dbi_version (for perl $] on $Config{archname})  
installed in $xst[0]\n";
      return File::Spec->canonpath($xst[0]);

diff -ru ./Makefile.PL  
--- ./Makefile.PL	2012-06-09 15:35:51.000000000 +0100
/usr/src/perl/perl-cross-compile/repo/perl/cpan/DBX-SQLite/Makefile.PL	2012-12-18  
11:40:22.000000000 +0000
@@ -51,12 +51,29 @@
  # Because DBI generates a postamble at configure-time, we need
  # the required version of DBI very early.
  my $DBI_required = 1.57;
-eval {
-	require DBI;
-if ( $@ or DBI->VERSION < $DBI_required ) {
-	print "DBI 1.57 is required to configure this module; please install it  
or upgrade your CPAN/CPANPLUS shell.\n";
-	exit(0);
+unless($ENV{PERL_CORE}) {
+    $ENV{PERL_CORE} = 1 if grep { $_ eq 'PERL_CORE=1' } @ARGV;
+my $dbi_version = '';
+if($ENV{PERL_CORE}) {
+    ## Avoid actually loading DBI, as we might be cross-compiling
+    my $updir = File::Spec->updir;
+    my $CORElibdir = File::Spec->catdir(($updir) x 2, 'lib');
+    my $DBI_pm = File::Spec->catfile($CORElibdir, '');
+    if(!-e $DBI_pm) {
+        die "Building under PERL_CORE, but $DBI_pm doesn't exist";
+    }
+    $dbi_version = ExtUtils::MM_Unix->parse_version($DBI_pm);
+} else {
+    eval {
+        require DBI;
+    };
+    $dbi_version = DBI->VERSION;
+if ( $@ or $dbi_version < $DBI_required ) {
+    print "DBI 1.57 is required to configure this module; please install  
it or upgrade your CPAN/CPANPLUS shell.\n";
+    exit(0);

  # See if we have a C compiler
@@ -356,7 +373,6 @@
  use Config;

  sub postamble {
-	require DBI;
  	require DBI::DBD;
  	my $postamble = eval {

Looking at the above I've just realised I failed to change actual finding  
of Driver.xst somewhere other than @INC, no wonder I had issues with the  
actual building... I'll go fix that now!


0:30h - Admin (writing up)
2:00h - Compiling and testing RunPerl with Object-Remote-Java
2:00h - Gitifying and documenting RunPerl
3:00h - Cross-compiling DBI and DBD::SQLite

Total: 7:30h

Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About