I recently bought the infamous Raspberry pi 3, which has got a
cortex-a53 4 cores 1.2 Ghz CPU (Broadcom). After installing on it
a 64 bit OS (a non official fedora 25), I was wondering if it was
possible to install a D compiler on it.
I first try LDC 0.17.4
After modifying some phobos/runtime file to fake support of IEEE
Quadruple precision floating point number available on this CPU,
I got a compiler..
$ ldc2 --version
LDC - the LLVM D compiler (0.17.4):
based on DMD v2.068.2 and LLVM 3.9.1
Default target: aarch64-unknown-linux-gnu
Host CPU: (unknown)
http://dlang.org - http://wiki.dlang.org/LDC
[...]
I then try LDC 1.2.0, but fail to compile it. Whatever if I use
clang (3.9) or gcc (6.3), the compilation stopped at some time,
probably because of the lack of memory of the pi 3 (1 GB).
I finally try GDC, on 6.3 gcc, and with support of version 2.68
of the D language. After struggling a little on a few
phobos/druntime files, I got a compiler here too:
$ gdc --version
gdc (GCC) 6.3.0
Copyright © 2016 Free Software Foundation, Inc.
Unfortunately both are unable to compile the following program:
//-----8<--------------------
import std.conv, std.stdio;
void main() {
double pi = to!double("3.1415926");
writeln("pi = ", pi);
}
//-----8<--------------------
opt/ldc-0.17.4/include/d/std/conv.d(295): Error: template
std.conv.toImpl cannot deduce function from argument types
!(double)(string), candidates are:
/opt/ldc-0.17.4/include/d/std/conv.d(361):
std.conv.toImpl(T, S)(S value) if (isImplicitlyConvertible!(S, T)
&& !isEnumStrToStr!(S, T) && !isNullToStr!(S, T))
/opt/ldc-0.17.4/include/d/std/conv.d(475):
std.conv.toImpl(T, S)(ref S s) if (isRawStaticArray!S)
/opt/ldc-0.17.4/include/d/std/conv.d(491):
std.conv.toImpl(T, S)(S value) if (!isImplicitlyConvertible!(S,
T) && is(typeof(S.init.opCast!T()) : T) && !isExactSomeString!T
&& !is(typeof(T(value))))
/opt/ldc-0.17.4/include/d/std/conv.d(542):
std.conv.toImpl(T, S)(S value) if (!isImplicitlyConvertible!(S,
T) && is(T == struct) && is(typeof(T(value))))
/opt/ldc-0.17.4/include/d/std/conv.d(591):
std.conv.toImpl(T, S)(S value) if (!isImplicitlyConvertible!(S,
T) && is(T == class) && is(typeof(new T(value))))
/opt/ldc-0.17.4/include/d/std/conv.d(295): ... (9 more, -v
to show) ...
bug.d(4): Error: template instance std.conv.to!double.to!(string)
error instantiating
and same for gdc:
/opt/gdc/lib/gcc/aarch64-unknown-linux-gnu/6.3.0/include/d/std/conv.d:295:24:
erreur : template std.conv.toImpl cannot deduce function from argument types
!(double)(string), candidates are:
return toImpl!T(args);
^
/opt/gdc/lib/gcc/aarch64-unknown-linux-gnu/6.3.0/include/d/std/conv.d:361:3: note :
std.conv.toImpl(T, S)(S value) if (isImplicitlyConvertible!(S, T) &&
!isEnumStrToStr!(S, T) && !isNullToStr!(S, T))
T toImpl(T, S)(S value)
^
/opt/gdc/lib/gcc/aarch64-unknown-linux-gnu/6.3.0/include/d/std/conv.d:475:3:
note : std.conv.toImpl(T, S)(ref S s) if (isRawStaticArray!S)
T toImpl(T, S)(ref S s)
^
/opt/gdc/lib/gcc/aarch64-unknown-linux-gnu/6.3.0/include/d/std/conv.d:491:3: note : std.conv.toImpl(T,
S)(S value) if (!isImplicitlyConvertible!(S, T) && is(typeof(S.init.opCast!T()) : T) &&
!isExactSomeString!T && !is(typeof(T(value))))
T toImpl(T, S)(S value)
^
/opt/gdc/lib/gcc/aarch64-unknown-linux-gnu/6.3.0/include/d/std/conv.d:542:3: note :
std.conv.toImpl(T, S)(S value) if (!isImplicitlyConvertible!(S, T) && is(T == struct)
&& is(typeof(T(value))))
T toImpl(T, S)(S value)
^
/opt/gdc/lib/gcc/aarch64-unknown-linux-gnu/6.3.0/include/d/std/conv.d:591:3: note :
std.conv.toImpl(T, S)(S value) if (!isImplicitlyConvertible!(S, T) && is(T == class)
&& is(typeof(new T(value))))
T toImpl(T, S)(S value)
^
/opt/gdc/lib/gcc/aarch64-unknown-linux-gnu/6.3.0/include/d/std/conv.d:295:24:
note : ... (9 more, -v to show) ...
return toImpl!T(args);
^
bug.d:4:23: erreur : template instance
std.conv.to!double.to!(string) error instantiating
double pi = to!double("3.1415926");
I did not touch at std.conv nor std.stdio. On LDC, the only
modification concerned math.d and gamma, missing support for
128-bit floating points.