Thanks! I'll take a look at building a cross-compiler, since it
worked out for you. I'd been a little afraid to try. (I previously
had a bad experience building ghc as a cross-compiler, but that was
with Android as the target and Mac OS X as the host. The issues I
encountered were mostly when it tried to link ELF binaries with the
Mach-O linker, or vice versa. But with both host and target being
Linux, the linker issues can probably be swept under the rug.)
The C cross compiler shouldn't be a problem, since OpenWRT's
"buildroot" builds a cross-compiler automatically. (Though if for
any reason that turns out to be a problem, thanks for the tip about
crosstool-ng.) Ideally, I'd love to integrate ghc into OpenWRT's
buildroot so that packages written in Haskell could be built as
easily and in the same way as packages written in C. But I still
have a lot to learn before I attempt that.
My boot device is an SD card, so space for static binaries shouldn't
be a problem. I already have several gigabytes, which should be
more than enough, and if for some reason I needed more space, I
could swap in a larger SD card, or add more space via USB or mSATA.
I was aware of Marios Titas's "GHC + musl = easier static linking",
but wasn't really thrilled at the idea of needing an install of
Gentoo-musl to host it. (But I can certainly try that if I have
to.) Or I could just use my OpenWRT box to host the GHC-musl, but
I'm running into issues with getting gcc to run on the target, which
I'm currently following up with the OpenWRT community.
Thanks for the ideas! I'm sure that one way or another I'll be able
to get it working.
--Patrick
On 4/10/16 8:40 AM, Tomas Carnecky
wrote:
I was able to compile Haskell for a mips-linux-musl
target (
https://onion.io/omega).
Most problems were due to the different architecture (MIPS) than
musl. Once you have a C cross-compiler (I used
http://crosstool-ng.org/ to
built the cross-compiler toolchain), compiling GHC as a cross
compiler for that target and then a Haskell application
shouldn't be a problem.
If you have enough disk space on the target, I would
suggest that you compile your Haskell application into a
static binary.
You will
probably have better luck using ghc with musl.
Check out this thread: https://mail.haskell.org/pipermail/haskell-cafe/2015-May/119843.html
Original Message
From: Patrick Pelletier
Sent: Saturday, April 9, 2016 7:54 AM
To: haskell-cafe
Subject: [Haskell-cafe] Haskell on OpenWRT
Has anyone had any success running Haskell programs on
OpenWRT?
Specifically, I'm running OpenWRT on x86_64, so processor
architecture
shouldn't be an issue. However, by default OpenWRT uses musl
as its C
library, so binaries from a "normal" Linux system wouldn't
be compatible
with OpenWRT.
I attempted to get around this problem by building an
OpenWRT image with
glibc as the C library. In theory, that ought to solve the
problem. In
practice, my program (a simple hello-world type program,
which runs fine
on Ubuntu) hung, printing nothing, using nearly all of one
core, and was
unkillable by any signal other than SIGKILL. If left alone
to run, it
eventually used all available memory and then died.
I took a look at ldd, to see if there were any clues there.
On my
Ubuntu 12.04 machine, where I compiled the program (using
ghc 7.4.1), I get:
ppelletier@patrick64:~/programming/haskell$ ldd contact
linux-vdso.so.1 => (0x00007fff36f50000)
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10
(0x00007f8d49cf8000)
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6
(0x00007f8d49af0000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6
(0x00007f8d497f3000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1
(0x00007f8d495eb000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
(0x00007f8d493e7000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
(0x00007f8d49028000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0
(0x00007f8d48e0b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8d49f8d000)
On my OpenWRT (trunk) box, I get:
root@OpenWrt:~# ldd /tmp/contact
linux-vdso.so.1 (0x00007ffd2afcc000)
libgmp.so.10 => /usr/lib/libgmp.so.10
(0x00007f27a057a000)
libffi.so.6 => /usr/lib/libffi.so.6 (0x00007f27a0373000)
libm.so.6 => /lib/libm.so.6 (0x00007f27a0080000)
librt.so.1 => /lib/librt.so.1 (0x00007f279fe79000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f279fc76000)
libc.so.6 => /lib/libc.so.6 (0x00007f279f906000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f279f6f4000)
libpthread.so.0 => /lib/libpthread.so.0
(0x00007f279f4d9000)
/lib64/ld-linux-x86-64.so.2 (0x00007f27a07dc000)
This is almost the same, except it has "libgcc_s.so.1",
while on the
Ubuntu box it does not.
I'd welcome any ideas on how to solve (or at least diagnose)
this
problem. I'd also be interested in any thoughts on the
broader question
of running Haskell programs on OpenWRT.
Thanks,
--Patrick
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe