The Raspberry Pi has a 700MHz ARM11-based CPU, 256Mb of RAM (of which at least 32Mb is used by the GPU), and uses an SD card for the filesystem. This is how it's $35 (+ tax and shipping)
It will build Perl 5 in 2 hours, and takes a further 4 hours to run the tests. (all pass) So, I attempted to build Rakudo on my Raspberry Pi, expecting it to go wrong. It didn't quite pan out the way I expected. Parrot built just fine. Immediately things went wrong with NQP: Finished install_dev_files.pl Parrot installed. Building NQP ... /usr/bin/perl Configure.pl --with-parrot=/home/nick/Perl/rakudo/install/bin/parrot --make-install Verifying installation ... Using /home/nick/Perl/rakudo/install/bin/parrot (version RELEASE_4_5_0). * configure package dyncall guess operating system linux guess arch error: unsupported architecture armv6l Command failed (status 256): cd 3rdparty/dyncall && sh configure Command failed (status 256): /usr/bin/perl Configure.pl --with-parrot=/home/nick/Perl/rakudo/install/bin/parrot --make-install real 75m55.607s user 63m12.770s sys 3m1.640s It seems that dyncall doesn't recognise arm6el as a class of ARM architecture which it supports. Given that it supports iOS, and has a configure option for ARM, it seems pretty clear that it does, so I bodged it this this: nick@raspberrypi ~/Perl/rakudo/nqp $ git diff diff --git a/Configure.pl b/Configure.pl index 5539471..f1a1c00 100644 --- a/Configure.pl +++ b/Configure.pl @@ -125,7 +125,7 @@ MAIN: { system_or_die('cd 3rdparty\dyncall && Configure.bat' . $configure_a $config{'dyncall_build'} = "cd 3rdparty/dyncall && $make BUILD_DIR= } else { - system_or_die('cd 3rdparty/dyncall && sh configure'); + system_or_die('cd 3rdparty/dyncall && sh configure --target-arm-arm if ($^O eq 'netbsd') { $config{'dyncall_build'} = "cd 3rdparty/dyncall && BUILD_DIR=. } else { With that, NQP has been builds and installs, given time: real 90m49.874s user 87m53.620s sys 0m40.190s However, the Rakudo build then fails with a SEGV on /home/nick/Perl/rakudo/install/bin/nqp --vmlibs=perl6_group,perl6_ops --target=pir --output=src/gen/perl6-actions.pir --encoding=utf8 src/Perl6/Actions.pm So I tried it again under gdb it completes. Bah. No backtrace. I then re-ran make and the very next command also SEGV'd: nick@raspberrypi ~/Perl/rakudo $ time make /home/nick/Perl/rakudo/install/bin/nqp --vmlibs=perl6_group,perl6_ops --target=pir --output=src/gen/perl6-actions.pir --encoding=utf8 \ src/Perl6/Actions.pm Segmentation fault make: *** [blib/Perl6/Actions.pbc] Error 139 real 8m16.604s user 8m13.570s sys 0m1.050s So I upped ulimit to get a core file, re-ran, and, bother, no error. However, it does end up failing here: The following step can take a long time, please be patient. ./perl6 --setting=NULL --optimize=3 --target=pir --stagestats --output=src/gen/CORE.setting.pir src/gen/CORE.setting Killed make: *** [CORE.setting.pbc] Error 137 real 107m48.770s user 85m40.700s sys 1m21.840s (it ran out of RAM and swap. When I idle I see) $ free total used free shared buffers cached Mem: 220616 24892 195724 0 5572 7080 -/+ buffers/cache: 12240 208376 Swap: 102396 11244 91152 So clearly 224Mb of RAM and 100Mb of swap aren't enough. At this point I tested things that did build. Parrot passes all tests: Test Summary Report ------------------- t/dynpmc/select.t (Wstat: 0 Tests: 14 Failed: 0) TODO passed: 14 Files=395, Tests=13921, 3309 wallclock secs (63.36 usr 5.22 sys + 2580.54 cusr 203.41 csys = 2852.53 CPU) Result: PASS NQP fails 1 test: Test Summary Report ------------------- t/nqp/60-bigint.t (Wstat: 0 Tests: 34 Failed: 3) Failed tests: 28-29, 34 Files=64, Tests=584, 773 wallclock secs ( 5.03 usr 0.61 sys + 751.26 cusr 11.36 csys = 768.26 CPU) Result: FAIL make: *** [core-test] Error 1 $ ./nqp t/nqp/60-bigint.t 1..34 ok 1 - can round-trip negative number (string) ok 2 - can round-trip negative number (string) by boxing ok 3 - can round-trip negative number by unboxing ok 4 - nqp::iseq_I can return false ok 5 - nqp::iseq_I can return true ok 6 - multiplication ok 7 - addition ok 8 - subtraction ok 9 - division ok 10 - bitshift left ok 11 - original not modified by bitshift left ok 12 - bitshift right ok 13 - bit and ok 14 - bit or ok 15 - bit xor ok 16 - bit negation ok 17 - Bit ops (RT 109740) ok 18 - can box to a complex type with a P6bigint target ok 19 - can get a bigint from a string with boxing type ok 20 - addition works on boxing type ok 21 - pow (int, positive) ok 22 - pow 0 ** large_number ok 23 - pow 1 ** large_number ok 24 - 2**100 to float ok 25 - (-2)**101 to float ok 26 - 123456789 * (-2)**101 to float ok 27 - bigint -> float, 1e16 not ok 28 - to_num and from_num round-trip not ok 29 - to_num and from_num round-trip (negative number) ok 30 - base_I with base 10 ok 31 - base_I with base 16 ok 32 - nqp::expmod_I ok 33 - div_In santiy not ok 34 - div_In with big numbers So, I commandeered a mobile phone charger to power an external USB hard drive, and now with 512Mb of swap tried this: $ /usr/bin/time -v ./perl6 --setting=NULL --optimize=3 --target=pir --stagestats --output=src/gen/CORE.setting.pir src/gen/CORE.setting; sleep 30; killall vmstat Stage parse: 52535.669 Stage syntaxcheck: 0.387 Stage past: 0.221 Stage optimize: 9936.757 The machine crashed after about 22 hours at 100% CPU. Not sure if this is because the outside temperature today is 28°C, and it felt unhappy. This is rather annoying as I think we were about 50% through my estimate of how long "Stage post" was going to take, with hopefully only 6 hours go go, ie 28 hours of swap hell just for that command. It would be wonderful if Rakudo's memory usage would drop. I think that that's going to be easier than finding a faster swap device. Nicholas Clark