develooper Front page | perl.perl5.porters | Postings from January 2014

Re: [perl #114798] Configure: add support of qemu

Thread Previous | Thread Next
From:
Brian Fraser
Date:
January 31, 2014 18:03
Subject:
Re: [perl #114798] Configure: add support of qemu
Message ID:
CA+nL+nb38anJ5Mg4x5vgknCFPASNJrwJRMKFdQOd_z6n5-dD=g@mail.gmail.com
On Sun, Sep 9, 2012 at 3:51 AM, Francois PERRAD
<perlbug-followup@perl.org>wrote:

> # New Ticket Created by  Francois PERRAD
> # Please include the string:  [perl #114798]
> # in the subject line of all future correspondence about this issue.
> # <URL: https://rt.perl.org:443/rt3/Ticket/Display.html?id=114798 >
>
>
> This is a bug report for perl from francois.perrad@gadz.org,
> generated with the help of perlbug 1.39 running under perl 5.14.2.
>
>
> -----------------------------------------------------------------
> [Please describe your issue here]
> my goal is the cross-compiling of Perl with Buildroot,
> see
> http://www.nntp.perl.org/group/perl.perl5.porters/2012/09/msg191592.html
> my last patch against Buildroot is
> http://patchwork.ozlabs.org/patch/182554/
> (the recipe is in package/perl/perl.mk)
>
> So, Configure needs a support of qemu (user mode).
>
> Find below 3 patches against blead
>
> >From 42abf7caea008ee7dc8a876d88e3dd4d7de3cc16 Mon Sep 17 00:00:00 2001
> From: Francois Perrad <francois.perrad@gadz.org>
> Date: Tue, 4 Sep 2012 16:26:09 +0200
> Subject: [PATCH 1/3] add qemu support
>
> $targetrun contains something like : qemu-arm, qemu-i386, qemu-ppc,
> qemu-x86_64
> $qemulib is a path
> Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
> ---
>  Configure |    8 ++++++++
>  1 file changed, 8 insertions(+)
>
> diff --git a/Configure b/Configure
> index a1ba981..c78cf77 100755
> --- a/Configure
> +++ b/Configure
> @@ -2911,6 +2911,14 @@ fi
>  $targetrun -l $targetuser $targethost "cd \$cwd && ./\$exe \$@"
>  EOF
>             ;;
> +       qemu*)
> +           to=:
> +           from=:
> +           cat >$run <<EOF
> +#!/bin/sh
> +$targetrun -L $qemulib "\$@"
> +EOF
> +           ;;
>         *)  echo "Unknown targetrun '$targetrun'" >&4
>             exit 1
>             ;;
> --
> 1.7.9.5
>
> >From f686dacad60a327728141efa38dee1614a875368 Mon Sep 17 00:00:00 2001
> From: Francois Perrad <francois.perrad@gadz.org>
> Date: Tue, 4 Sep 2012 16:27:48 +0200
> Subject: [PATCH 2/3] fix when cross-devel
>
> $run must be used
>
> Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
> ---
>  Configure |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/Configure b/Configure
> index c78cf77..6cc87af 100755
> --- a/Configure
> +++ b/Configure
> @@ -5059,7 +5059,7 @@ checkccflag='check=$1; flag=$2; callback=$3;
>  echo " ";
>  echo "Checking if your compiler accepts $flag" 2>&1;
>  echo "int main(void) { return 0; }" > gcctest.c;
> -if $cc -O2 $flag -o gcctest gcctest.c 2>gcctest.out && ./gcctest; then
> +if $cc -O2 $flag -o gcctest gcctest.c 2>gcctest.out && $run ./gcctest;
> then
>      echo "Yes, it does." 2>&1;
>      if $test -s gcctest.out ; then
>          echo "But your platform does not like it:";
> --
> 1.7.9.5
>
> >From fc0278276b992191dd4d81a55a64f5b3b6922812 Mon Sep 17 00:00:00 2001
> From: Francois Perrad <francois.perrad@gadz.org>
> Date: Tue, 4 Sep 2012 16:45:30 +0200
> Subject: [PATCH 3/3] add a default for targethost when qemu
>
> targethost is mandatory with a ssh connection, but useless with qemu
>
> Signed-off-by: Francois Perrad <francois.perrad@gadz.org>
> ---
>  Configure |    3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/Configure b/Configure
> index 6cc87af..ff81233 100755
> --- a/Configure
> +++ b/Configure
> @@ -2840,6 +2840,9 @@ $define|true|[yY]*)
>              ;;
>          *)  echo "Using usrinc $usrinc." >&4 ;;
>         esac
> +       case "$targetrun" in
> +       qemu*) targethost=dummy ;;
> +       esac
>         case "$targethost" in
>         '') echo "Targethost not defined." >&4; croak=y ;;
>          *)  echo "Using targethost $targethost." >&4
> --
> 1.7.9.5
>
>
Jumpstarting this ticket. Francois recently chimed in on another thread &
updated the patch[0], so I applied it locally and gave it a try.
With some tweaking I was able to build a perl on my amd64 Linux box that
runs on a raspberry pi without needing to access the target system in any
way; additionally, with some manual hacks 'make test' for that perl managed
to run in its entirely, *locally*, which is huge. So I think that there's
quite a bit of worth in pursuing this.

That being said, I had a couple of problems along the way. First, for me
the current $run dies with 'FATAL: kernel too old'. Some googling lead me
to discover that I could pass qemu the kernel version with the -r switch,
ala qemu-arm -r 3.11, and that solved the problem, so to the very least, a
way of passing options to qemu is needed. Additionally, $run needs to be
able to handle -cwd and -env, so locally it looks like this for me:

         cat >$run <<EOF
#!/bin/sh
env=''
case "\$1" in
-cwd)
  shift
  cwd=\$1
  shift
  ;;
esac
case "\$1" in
-env)
  shift
  env=\$1
  shift
  ;;
esac
case "\$cwd" in
'') ;;
*) cd \$cwd ;;
esac
\$env $targetrun $qemuoptions -L $sysroot "\$@"
EOF

With $qemuoptions being something like "-r 3.11".

Moving on, I too am unsure about the `basename ...` line. The intent seems
to be that $run end up as run-qemu-arm when Configure is called with either
-Dtargetrun=/foo/bar/qemu-arm or -Dtargetrun='qemu-arm -r 3.11'. The latter
seems like the wrong way to go about it; for the former, we currently
assume that whatever targetrun is, it'll be in PATH; if we're going to
start accepting fulls paths to binaries in targetrun, the other options
should be fixed as well.

For 'make test', I had to basically replace ./perl with a script that
called ./original-perl through $run, but I also had to make it load a
compat module that removed 'original-' from $^X. Which is just nasty.

Unrelated to this patch but in a similar vein, yesterday I pushed a branch
that allows cross-compiling from Linux to Win32, either through ssh or
wine[1]. The wine bits are unsurprisingly pretty similar to this.

[0]
https://github.com/fperrad/br/blob/perl-castaway/package/perl/perl-configure-qemu.patch
[1]
http://perl5.git.perl.org/perl.git/shortlog/refs/heads/hugmeir/cross-compile-win32

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About