Patchwork [v4,3/3] gnu: Update ldc to 0.17.1.

login
register
mail settings
Submitter Danny Milosavljevic
Date Sept. 13, 2016, 10:30 a.m.
Message ID <20160913103042.7302-4-dannym@scratchpost.org>
Download mbox | patch
Permalink /patch/15572/
State New
Headers show

Comments

Danny Milosavljevic - Sept. 13, 2016, 10:30 a.m.
* gnu/packages/ldc.scm (ldc): Update to 0.17.1.
---
 gnu/packages/ldc.scm                               |  15 ++-
 .../patches/ldc-0.17.1-disable-tests.patch         | 147 +++++++++++++++++++++
 2 files changed, 156 insertions(+), 6 deletions(-)
 create mode 100644 gnu/packages/patches/ldc-0.17.1-disable-tests.patch
Leo Famulari - Sept. 13, 2016, 4:55 p.m.
On Tue, Sep 13, 2016 at 12:30:42PM +0200, Danny Milosavljevic wrote:
> * gnu/packages/ldc.scm (ldc): Update to 0.17.1.

With this patch, LDC fails to build on my x86_64 machine with the
familiar errors about isnan and isinf:

[ 11%] Building CXX object CMakeFiles/LDCShared.dir/dmd2/scope.c.o
/gnu/store/frrj3bfbmg5vrd0flh9cf8j64h7cr2v4-gcc-4.9.3/bin/c++   -DDMDV2 -DHAVE_SC_ARG_MAX -DIN_LLVM -DLDC_INSTALL_PREFIX=\"/gnu/store/4p7hh4a7dyp2wg7zd08lvlxafayrjznx-ldc-0.17.1\" -DLDC_LLVM_VER=307 -DLLVM_INTRINSIC_TD_PATH=\"/gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include\" -DOPAQUE_VTBLS -D__LITTLE_ENDIAN__ -I/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/. -I/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2 -I/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root -I/tmp/guix-build-ldc-0.17.1.drv-0/build/dmd2 -I/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1 -isystem /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include -isystem /gnu/store/1v4anv1dwvskkav1zj08gicwaibachr1-libconfig-1.5/include  -O2 -g -DNDEBUG   -I/gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include  -fPIC -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wno-maybe-uninitialized -Wno-comment -std=c++11 -ffunction-sections -fdata-sections -O3 -DNDEBUG -fno-exceptions -fno-rtti  -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS   -w -DPOSIX -DLDC_POSIX  -o CMakeFiles/LDCShared.dir/dmd2/scope.c.o -c /tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/scope.c
/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root/port.c: In static member function ‘static int Port::isNan(double)’:
/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root/port.c:773:19: error: ‘isnan’ was not declared in this scope
     return isnan(r);
                   ^
/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root/port.c:773:19: note: suggested alternative:
In file included from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/Support/DataTypes.h:35:0,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/Support/SwapByteOrder.h:19,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/Support/MathExtras.h:18,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/ADT/SmallVector.h:20,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/ADT/ArrayRef.h:14,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/ADT/APInt.h:19,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/ADT/APFloat.h:20,
                 from /tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root/port.c:677:
/gnu/store/frrj3bfbmg5vrd0flh9cf8j64h7cr2v4-gcc-4.9.3/include/c++/cmath:632:5: note:   ‘std::isnan’
     isnan(_Tp __x)
     ^
/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root/port.c: In static member function ‘static int Port::isNan(longdouble)’:
/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root/port.c:789:19: error: ‘isnan’ was not declared in this scope
     return isnan(r);
                   ^
/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root/port.c:789:19: note: suggested alternative:
In file included from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/Support/DataTypes.h:35:0,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/Support/SwapByteOrder.h:19,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/Support/MathExtras.h:18,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/ADT/SmallVector.h:20,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/ADT/ArrayRef.h:14,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/ADT/APInt.h:19,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/ADT/APFloat.h:20,
                 from /tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root/port.c:677:
/gnu/store/frrj3bfbmg5vrd0flh9cf8j64h7cr2v4-gcc-4.9.3/include/c++/cmath:632:5: note:   ‘std::isnan’
     isnan(_Tp __x)
     ^
/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root/port.c: In static member function ‘static int Port::isInfinity(double)’:
/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root/port.c:817:19: error: ‘isinf’ was not declared in this scope
     return isinf(r);
                   ^
/tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root/port.c:817:19: note: suggested alternative:
In file included from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/Support/DataTypes.h:35:0,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/Support/SwapByteOrder.h:19,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/Support/MathExtras.h:18,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/ADT/SmallVector.h:20,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/ADT/ArrayRef.h:14,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/ADT/APInt.h:19,
                 from /gnu/store/vy5wrh1igqlcswxi6bmfdl16frpjw7nf-llvm-3.7.1/include/llvm/ADT/APFloat.h:20,
                 from /tmp/guix-build-ldc-0.17.1.drv-0/ldc-0.17.1/dmd2/root/port.c:677:
/gnu/store/frrj3bfbmg5vrd0flh9cf8j64h7cr2v4-gcc-4.9.3/include/c++/cmath:614:5: note:   ‘std::isinf’
     isinf(_Tp __x)
     ^
make[2]: *** [CMakeFiles/LDCShared.dir/build.make:1517: CMakeFiles/LDCShared.dir/dmd2/root/port.c.o] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory '/tmp/guix-build-ldc-0.17.1.drv-0/build'
make[1]: *** [CMakeFiles/Makefile2:220: CMakeFiles/LDCShared.dir/all] Error 2
make[1]: Leaving directory '/tmp/guix-build-ldc-0.17.1.drv-0/build'
make: *** [Makefile:164: all] Error 2
phase `build' failed after 50.8 seconds
builder for `/gnu/store/h01skxl6jasx9ckf47abgsq9s4v3my4i-ldc-0.17.1.drv' failed with exit code 1
@ build-failed /gnu/store/h01skxl6jasx9ckf47abgsq9s4v3my4i-ldc-0.17.1.drv - 1 builder for `/gnu/store/h01skxl6jasx9ckf47abgsq9s4v3my4i-ldc-0.17.1.drv' failed with exit code 1
guix build: error: build failed: build of `/gnu/store/h01skxl6jasx9ckf47abgsq9s4v3my4i-ldc-0.17.1.drv' failed

> diff --git a/gnu/packages/patches/ldc-0.17.1-disable-tests.patch b/gnu/packages/patches/ldc-0.17.1-disable-tests.patch

Can you add a comment to this patch explaining where it came from and
what it does?
Efraim Flashner - Sept. 13, 2016, 7:25 p.m.
https://wiki.dlang.org/LDC
https://github.com/ldc-developers/ldc/releases/tag/v0.17.1

After 0.17.1 is working on guix *someone* should change the supported
platforms to include arm.  Based on the wiki it sounds like maybe we
should try building it on mips also.
Danny Milosavljevic - Sept. 13, 2016, 7:44 p.m.
Sigh. Yeah, I've researched a bit why that happens.

The story is this:

glibc wanted to have isinf work with double AND float etc without conversion. Therefore, there is a special gcc construct where you can find out what type a parameter is IN A MACRO. Therefore, in C, isnan is a macro and so is isinf. The include file defining it is <math.h>

However, in C++ there's a include file <cmath>. This one provides normal functions in the namespace "std" (since overloads are possible in C++).

dmd2 undefs isinf which is why the C version doesn't work anymore (that's stupid, really. What were they thinking?). But then they dont use the namespace std so it won't use that one either. "::isinf" is DEFINITELY wrong - no idea how that ever worked. It won't find the macro that way AND it won't find the function in namespace std either (since <nothing>:: definitely says you want the one without namespace).

Some LLVM versions include <cmath> somewhere in their header files - so dmd2 is forced to use cmath rather than math.h even though they *want* to use math.h and the source code says so.

Therefore, I now use the C++ std::isinf - I hope LLVM won't change their mind again because then it will break again.

Patch

diff --git a/gnu/packages/ldc.scm b/gnu/packages/ldc.scm
index 560fa49..70b2c5e 100644
--- a/gnu/packages/ldc.scm
+++ b/gnu/packages/ldc.scm
@@ -29,6 +29,7 @@ 
   #:use-module (gnu packages compression)
   #:use-module (gnu packages libedit)
   #:use-module (gnu packages llvm)
+  #:use-module (gnu packages python)
   #:use-module (gnu packages textutils)
   #:use-module (gnu packages zip))
 
@@ -76,7 +77,7 @@  and freshness without requiring additional information from the user.")
 (define-public ldc
   (package
     (name "ldc")
-    (version "0.16.1")
+    (version "0.17.1")
     (source (origin
               (method url-fetch)
               (uri (string-append
@@ -85,7 +86,7 @@  and freshness without requiring additional information from the user.")
               (file-name (string-append name "-" version ".tar.gz"))
               (sha256
                (base32
-                "1jvilxx0rpqmkbja4m69fhd5g09697xq7vyqp2hz4hvxmmmv4j40"))))
+                "0rwggnbr60jbajfdw11kx058llmwljiss8rrv8df07vaygiv845i"))))
     (build-system cmake-build-system)
     ;; LDC currently only supports the x86_64 and i686 architectures.
     (supported-systems '("x86_64-linux" "i686-linux"))
@@ -130,6 +131,8 @@  and freshness without requiring additional information from the user.")
      `(("llvm" ,llvm-3.7)
        ("clang" ,clang-3.7)
        ("unzip" ,unzip)
+       ("python-wrapper" ,python-wrapper) ; Needed for running tests
+       ("python-lit" ,python-lit) ; Needed for running tests
        ("phobos-src"
         ,(origin
            (method url-fetch)
@@ -138,8 +141,8 @@  and freshness without requiring additional information from the user.")
                  version ".tar.gz"))
            (sha256
             (base32
-             "0sgdj0536c4nb118yiw1f8lqy5d3g3lpg9l99l165lk9xy45l9z4"))
-           (patches (search-patches "ldc-disable-tests.patch"))))
+             "17nb1yvqblqj3q42c8nlnwvy823fw6kna28n2b48j4m6kd2w0nan"))
+           (patches (search-patches "ldc-0.17.1-disable-tests.patch"))))
        ("druntime-src"
         ,(origin
            (method url-fetch)
@@ -148,7 +151,7 @@  and freshness without requiring additional information from the user.")
                  version ".tar.gz"))
            (sha256
             (base32
-             "0z4mkyddx6c4sy1vqgqvavz55083dsxws681qkh93jh1rpby9yg6"))))
+             "129j7mfd0vnzaw7i6hr5waxm5cb0qcm8gyawy2xy5avlv8hrw5m4"))))
        ("dmd-testsuite-src"
         ,(origin
            (method url-fetch)
@@ -157,7 +160,7 @@  and freshness without requiring additional information from the user.")
                  version ".tar.gz"))
            (sha256
             (base32
-             "0yc6miidzgl9k33ygk7xcppmfd6kivqj02cvv4fmkbs3qz4yy3z1"))))))
+             "18h16lwwmr3k9dh7mcip17il72mz680wnygv9d0mdnivczn80zyv"))))))
     (home-page "http://wiki.dlang.org/LDC")
     (synopsis "LLVM compiler for the D programming language")
     (description
diff --git a/gnu/packages/patches/ldc-0.17.1-disable-tests.patch b/gnu/packages/patches/ldc-0.17.1-disable-tests.patch
new file mode 100644
index 0000000..ee73077
--- /dev/null
+++ b/gnu/packages/patches/ldc-0.17.1-disable-tests.patch
@@ -0,0 +1,147 @@ 
+Only in b/std: algorithm
+Only in b/std: array.d
+Only in b/std: ascii.d
+Only in b/std: base64.d
+Only in b/std: bigint.d
+Only in b/std: bitmanip.d
+Only in b/std: c
+Only in b/std: compiler.d
+Only in b/std: complex.d
+Only in b/std: concurrency.d
+Only in b/std: container
+Only in b/std: conv.d
+Only in b/std: cstream.d
+Only in b/std: csv.d
+diff -ru a/std/datetime.d b/std/datetime.d
+--- a/std/datetime.d	2016-08-02 23:56:13.969292202 +0200
++++ b/std/datetime.d	2016-08-02 23:57:39.078408313 +0200
+@@ -28080,9 +28080,6 @@
+         import std.algorithm : sort;
+         import std.range : retro;
+         import std.format : format;
+-
+-        name = strip(name);
+-
+         enforce(tzDatabaseDir.exists(), new DateTimeException(format("Directory %s does not exist.", tzDatabaseDir)));
+         enforce(tzDatabaseDir.isDir, new DateTimeException(format("%s is not a directory.", tzDatabaseDir)));
+ 
+@@ -28094,7 +28091,10 @@
+             immutable file = buildNormalizedPath(tzDatabaseDir, tzFilename);
+         }
+         else
+-            immutable file = buildNormalizedPath(tzDatabaseDir, name);
++        {
++            auto filename = "./" ~ strip(name); // make sure the prefix is not stripped
++            immutable file = buildNormalizedPath(tzDatabaseDir, filename);
++        }
+ 
+         enforce(file.exists(), new DateTimeException(format("File %s does not exist.", file)));
+         enforce(file.isFile, new DateTimeException(format("%s is not a file.", file)));
+Only in b/std: datetime.d.orig
+Only in b/std: demangle.d
+Only in b/std: digest
+Only in b/std: encoding.d
+Only in b/std: exception.d
+Only in b/std: experimental
+Only in b/std: file.d
+Only in b/std: format.d
+Only in b/std: functional.d
+Only in b/std: getopt.d
+Only in b/std: internal
+Only in b/std: json.d
+Only in b/std: math.d
+Only in b/std: mathspecial.d
+Only in b/std: meta.d
+Only in b/std: metastrings.d
+Only in b/std: mmfile.d
+Only in b/std: net
+Only in b/std: numeric.d
+Only in b/std: outbuffer.d
+Only in b/std: parallelism.d
+diff -ru a/std/path.d b/std/path.d
+--- a/std/path.d	2016-08-02 23:56:03.781158908 +0200
++++ b/std/path.d	2016-08-02 23:54:06.111624406 +0200
+@@ -3724,8 +3724,8 @@
+         }
+         else
+         {
+-            assert(expandTilde("~root") == "/root", expandTilde("~root"));
+-            assert(expandTilde("~root/") == "/root/", expandTilde("~root/"));
++            //assert(expandTilde("~root") == "/root", expandTilde("~root"));
++            //assert(expandTilde("~root/") == "/root/", expandTilde("~root/"));
+         }
+         assert(expandTilde("~Idontexist/hey") == "~Idontexist/hey");
+     }
+Only in b/std: path.d.orig
+Only in b/std: process.d
+Only in b/std: random.d
+Only in b/std: range
+Only in b/std: regex
+Only in b/std: signals.d
+diff -ru a/std/socket.d b/std/socket.d
+--- a/std/socket.d	2016-08-02 23:56:22.881408857 +0200
++++ b/std/socket.d	2016-08-03 10:09:44.761019447 +0200
+@@ -501,18 +501,19 @@
+ version(CRuntime_Bionic) {} else
+ unittest
+ {
+-    softUnittest({
++    pragma(msg, "test disabled on GNU Guix");
++    //softUnittest({
+         Protocol proto = new Protocol;
+-        assert(proto.getProtocolByType(ProtocolType.TCP));
++        //assert(proto.getProtocolByType(ProtocolType.TCP));
+         //writeln("About protocol TCP:");
+         //writefln("\tName: %s", proto.name);
+         // foreach(string s; proto.aliases)
+         // {
+         //      writefln("\tAlias: %s", s);
+         // }
+-        assert(proto.name == "tcp");
+-        assert(proto.aliases.length == 1 && proto.aliases[0] == "TCP");
+-    });
++        //assert(proto.name == "tcp");
++        //assert(proto.aliases.length == 1 && proto.aliases[0] == "TCP");
++    //});
+ }
+ 
+ 
+@@ -842,6 +843,8 @@
+ 
+ unittest
+ {
++    pragma(msg, "test disabled on GNU Guix");
++    /*
+     InternetHost ih = new InternetHost;
+ 
+     ih.getHostByAddr(0x7F_00_00_01);
+@@ -872,6 +875,7 @@
+         //      writefln("aliases[%d] = %s", i, s);
+         // }
+     });
++    */
+ }
+ 
+ 
+Only in b/std: socket.d.orig
+Only in b/std: socketstream.d
+Only in b/std: stdint.d
+Only in b/std: stdiobase.d
+Only in b/std: stdio.d
+Only in b/std: stream.d
+Only in b/std: string.d
+Only in b/std: syserror.d
+Only in b/std: system.d
+Only in b/std: traits.d
+Only in b/std: typecons.d
+Only in b/std: typelist.d
+Only in b/std: typetuple.d
+Only in b/std: uni.d
+Only in b/std: uri.d
+Only in b/std: utf.d
+Only in b/std: uuid.d
+Only in b/std: variant.d
+Only in b/std: windows
+Only in b/std: xml.d
+Only in b/std: zip.d
+Only in b/std: zlib.d