summary refs log tree commit diff
path: root/gnu/packages/patches/ilmbase-fix-tests.patch
diff options
context:
space:
mode:
authorLeo Famulari <leo@famulari.name>2016-02-29 02:23:43 -0500
committerLeo Famulari <leo@famulari.name>2016-03-01 19:08:31 -0500
commit5e8276dcf4e3a05f69176dca816f00616e7f0593 (patch)
tree39a9cb3a010f412bbd07b117c5bfdabe9387087d /gnu/packages/patches/ilmbase-fix-tests.patch
parent88ccca45f6925808c7b0fbca775ca0de6c866d7e (diff)
downloadguix-5e8276dcf4e3a05f69176dca816f00616e7f0593.tar.gz
gnu: ilmbase: Add patch to fix build on i686.
Fixes <http://bugs.gnu.org/22049>.

* gnu/packages/patches/ilmbase-fix-tests.patch: New file.
* gnu-system.am (dist_patch_DATA): Add it.
* gnu/packages/graphics.scm (ilmbase)[source]: Add patch.
Diffstat (limited to 'gnu/packages/patches/ilmbase-fix-tests.patch')
-rw-r--r--gnu/packages/patches/ilmbase-fix-tests.patch149
1 files changed, 149 insertions, 0 deletions
diff --git a/gnu/packages/patches/ilmbase-fix-tests.patch b/gnu/packages/patches/ilmbase-fix-tests.patch
new file mode 100644
index 0000000000..fcaa37d201
--- /dev/null
+++ b/gnu/packages/patches/ilmbase-fix-tests.patch
@@ -0,0 +1,149 @@
+Fix FTBFS on i686-linux due to rounding issue (see references).
+
+Fixes Guix bug #22049 (see below).
+
+Copied from Debian.
+
+Source:
+https://sources.debian.net/src/ilmbase/2.2.0-11/debian/patches/testBoxAlgo.patch/
+https://sources.debian.net/src/ilmbase/2.2.0-11/debian/patches/testBox.patch/
+
+References:
+https://lists.nongnu.org/archive/html/openexr-devel/2015-12/msg00001.html
+https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22049
+https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=815712
+https://anonscm.debian.org/cgit/pkg-phototools/ilmbase.git/commit/?id=ab28bb45cdad8adc32e345b777ab8e692b1d9a9c
+
+---
+
+Subject: testBoxAlgo: allow fuzzy match of b12 == b2
+From: Steven Chamberlain <steven@pyro.eu.org>
+Date: Wed, 24 Feb 2016 01:04:11 +0000
+
+Also fix a pre-existing typo.
+
+Index: ilmbase/ImathTest/testBoxAlgo.cpp
+===================================================================
+--- ilmbase.orig/ImathTest/testBoxAlgo.cpp
++++ ilmbase/ImathTest/testBoxAlgo.cpp
+@@ -886,10 +886,11 @@ boxMatrixTransform ()
+ 
+     assert (approximatelyEqual (b2.min, b4.min, e));
+     assert (approximatelyEqual (b2.max, b4.max, e));
+-    assert (approximatelyEqual (b3.max, b4.max, e));
++    assert (approximatelyEqual (b3.min, b4.min, e));
+     assert (approximatelyEqual (b3.max, b4.max, e));
+ 
+-    assert (b21 == b2);
++    assert (approximatelyEqual (b2.min, b21.min, e));
++    assert (approximatelyEqual (b2.max, b21.max, e));
+     assert (b31 == b3);
+ 
+     M[0][3] = 1;
+
+---
+
+Subject: testBox: allow fuzzy comparison of floats, doubles
+From: Steven Chamberlain <steven@pyro.eu.org>
+Date: Wed, 24 Feb 2016 01:10:11 +0000
+
+Allow for inexact values, as long as the error is smaller than the
+epsilon of the data type.
+
+On 32-bit x86, allow even greater discrepency at double
+precision, due to possible double-rounding.  See
+https://lists.nongnu.org/archive/html/openexr-devel/2015-12/msg00001.html
+
+Index: ilmbase/ImathTest/testBox.cpp
+===================================================================
+--- ilmbase.orig/ImathTest/testBox.cpp
++++ ilmbase/ImathTest/testBox.cpp
+@@ -47,6 +47,58 @@ using namespace IMATH_INTERNAL_NAMESPACE
+ 
+ namespace {
+ 
++template <class T>
++bool
++approximatelyEqual (const T &p1, const T &p2)
++{
++	/* int and short should be exact */
++	return (p1 == p2);
++}
++
++bool
++approximatelyEqual (const Vec2<float> &p1, const Vec2<float> &p2)
++{
++    float e = limits<float>::epsilon();
++    float m = 0;
++
++    for (int i = 0; i < 2; ++i)
++    {
++	m = max (m, abs (p1[i]));
++	m = max (m, abs (p2[i]));
++    }
++
++    for (int i = 0; i < 2; ++i)
++	if (!equalWithAbsError (p1[i], p2[i], m * e))
++	    return false;
++
++    return true;
++}
++
++bool
++approximatelyEqual (const Vec2<double> &p1, const Vec2<double> &p2)
++{
++#if defined(__i386__) || defined(_M_IX86)
++    /* double-rounding on 32-bit x86 may cause larger error:
++       use epsilon of float rather than double */
++    double e = limits<float>::epsilon();
++#else
++    double e = limits<double>::epsilon();
++#endif
++    double m = 0;
++
++    for (int i = 0; i < 2; ++i)
++    {
++	m = max (m, abs (p1[i]));
++	m = max (m, abs (p2[i]));
++    }
++
++    for (int i = 0; i < 2; ++i)
++	if (!equalWithAbsError (p1[i], p2[i], m * e))
++	    return false;
++
++    return true;
++}
++
+ //
+ // Test case generation utility - create a vector of IMATH_INTERNAL_NAMESPACE::Vec{2,3,4}
+ // with all permutations of integers 1..T::dimensions().
+@@ -250,7 +302,8 @@ testExtendByPoint(const char *type)
+                               
+         IMATH_INTERNAL_NAMESPACE::Box<T> b;
+         b.extendBy(p);
+-        assert(b.min == p && b.max == p);
++        assert (approximatelyEqual (b.min, p));
++        assert (approximatelyEqual (b.max, p));
+     }
+ 
+     //
+@@ -283,7 +336,8 @@ testExtendByPoint(const char *type)
+ 
+             b.extendBy(p);
+ 
+-            assert(b.min == min && b.max == max);
++            assert (approximatelyEqual (b.min, min));
++            assert (approximatelyEqual (b.max, max));
+         }
+     }
+ }
+@@ -358,7 +412,8 @@ testExtendByBox(const char *type)
+             }
+             b.extendBy(IMATH_INTERNAL_NAMESPACE::Box<T>(p0, p1));
+ 
+-            assert(b.min == min && b.max == max);
++            assert (approximatelyEqual (b.min, min));
++            assert (approximatelyEqual (b.max, max));
+         }
+     }
+ }