Package: haskell-lens
Severity: normal
Version: 3.9.0.2
Tags: patch

Lens FTBFS on arches without TH, but the template haskell is only used
for deriving lenses for records (and some dependencies of error lenses).
Lens is otherwise useable on those arches. For example, code might only
want to use a lens into tuples, or maps, or any of the many other
provided lenses. Or a package that does need record lenses could be
fixed to build on all arches rather simply by pasting in the boilerplate
getters and setters, and could then use the rest of lens.

I have been avoiding using lens for some time because of this
portability problem. But it strikes me that the rest of the haskell
community is not likely to do that, and it seems to be getting more
widely used. So I think Debian should consider modifying lens to build
without TH on arches that lack it. 

The modifications turn out to be fairly reasonable. Patches attached.

There is a risk that some package that currently builds on arches
without TH currently tests that lens is not available, and avoids using
Control.Lens.TH. With this patch, such a test would be defeated, and the
package's build would be broken. I feel this is an fairly unlikely
scenario, and one that would be quickly caught in the regular haskell
package rebuild cycle, and would be easily fixed.

-- 
see shy jo
From 04510ab1a91ec7445b9575e9cb7fda3be94b2b2c Mon Sep 17 00:00:00 2001
From: Joey Hess <j...@kitenet.net>
Date: Sun, 13 Oct 2013 01:55:21 -0400
Subject: [PATCH 1/3] remove hlint ANNotations

These prevent building on systems without ghci.
---
 debian/control                      |    7 +++----
 src/Control/Exception/Lens.hs       |    2 --
 src/Control/Lens.hs                 |    1 -
 src/Control/Lens/Equality.hs        |    3 ---
 src/Control/Lens/Fold.hs            |    4 ----
 src/Control/Lens/Internal.hs        |    1 -
 src/Control/Lens/Internal/Zipper.hs |    1 -
 src/Control/Lens/Iso.hs             |    1 -
 src/Control/Lens/Lens.hs            |    2 --
 src/Control/Lens/Operators.hs       |    1 -
 src/Control/Lens/Plated.hs          |    1 -
 src/Control/Lens/Prism.hs           |    1 -
 src/Control/Lens/Setter.hs          |    1 -
 src/Data/Data/Lens.hs               |    3 ---
 14 files changed, 3 insertions(+), 26 deletions(-)

diff --git a/debian/control b/debian/control
index 83af3b0..364ee63 100644
--- a/debian/control
+++ b/debian/control
@@ -26,9 +26,9 @@ Build-Depends: debhelper (>= 9)
  , libghc-distributive-dev (>> 0.3)
  , libghc-distributive-dev (<< 1)
  , libghc-distributive-prof
- , libghc-generic-deriving-dev (>> 1.4)
- , libghc-generic-deriving-dev (<< 1.6)
- , libghc-generic-deriving-prof
+ , libghc-generic-deriving-dev (>> 1.4) [!armel]
+ , libghc-generic-deriving-dev (<< 1.6) [!armel]
+ , libghc-generic-deriving-prof [!armel]
  , libghc-hashable-dev (>> 1.1.2.3)
  , libghc-hashable-dev (<< 1.3)
  , libghc-hashable-prof
@@ -62,7 +62,6 @@ Build-Depends: debhelper (>= 9)
  , libghc-tagged-dev (>> 0.4.4)
  , libghc-tagged-dev (<< 1)
  , libghc-tagged-prof
- , ghc-ghci
  , libghc-text-dev (>> 0.11)
  , libghc-text-dev (<< 0.12)
  , libghc-text-prof
diff --git a/src/Control/Exception/Lens.hs b/src/Control/Exception/Lens.hs
index 4bc3926..34b46ff 100644
--- a/src/Control/Exception/Lens.hs
+++ b/src/Control/Exception/Lens.hs
@@ -112,8 +112,6 @@ import Prelude
   ,  Maybe(..), Either(..), Functor(..), String, IO
   )
 
-{-# ANN module "HLint: ignore Use Control.Exception.catch" #-}
-
 -- $setup
 -- >>> :set -XNoOverloadedStrings
 -- >>> :m + Control.Exception Control.Monad Data.List Prelude
diff --git a/src/Control/Lens.hs b/src/Control/Lens.hs
index 242c3c1..c60cf91 100644
--- a/src/Control/Lens.hs
+++ b/src/Control/Lens.hs
@@ -99,4 +99,3 @@ import Control.Lens.Wrapped
 import Control.Lens.Zipper
 import Control.Lens.Zoom
 
-{-# ANN module "HLint: ignore Use import/export shortcut" #-}
diff --git a/src/Control/Lens/Equality.hs b/src/Control/Lens/Equality.hs
index 982c2d7..32c25c3 100644
--- a/src/Control/Lens/Equality.hs
+++ b/src/Control/Lens/Equality.hs
@@ -28,9 +28,6 @@ module Control.Lens.Equality
 import Control.Lens.Internal.Setter
 import Control.Lens.Type
 
-{-# ANN module "HLint: ignore Use id" #-}
-{-# ANN module "HLint: ignore Eta reduce" #-}
-
 -- $setup
 -- >>> import Control.Lens
 
diff --git a/src/Control/Lens/Fold.hs b/src/Control/Lens/Fold.hs
index 32a4073..aec2d4d 100644
--- a/src/Control/Lens/Fold.hs
+++ b/src/Control/Lens/Fold.hs
@@ -163,10 +163,6 @@ import Data.Traversable
 -- >>> let g :: Expr -> Expr; g = Debug.SimpleReflect.Vars.g
 -- >>> let timingOut :: NFData a => a -> IO a; timingOut = fmap (fromMaybe (error "timeout")) . timeout (5*10^6) . evaluate . force
 
-{-# ANN module "HLint: ignore Eta reduce" #-}
-{-# ANN module "HLint: ignore Use camelCase" #-}
-{-# ANN module "HLint: ignore Use curry" #-}
-
 infixl 8 ^.., ^?, ^?!, ^@.., ^@?, ^@?!
 
 --------------------------
diff --git a/src/Control/Lens/Internal.hs b/src/Control/Lens/Internal.hs
index 295662e..7b30335 100644
--- a/src/Control/Lens/Internal.hs
+++ b/src/Control/Lens/Internal.hs
@@ -43,4 +43,3 @@ import Control.Lens.Internal.Review
 import Control.Lens.Internal.Setter
 import Control.Lens.Internal.Zoom
 
-{-# ANN module "HLint: ignore Use import/export shortcut" #-}
diff --git a/src/Control/Lens/Internal/Zipper.hs b/src/Control/Lens/Internal/Zipper.hs
index 95875b7..9139d18 100644
--- a/src/Control/Lens/Internal/Zipper.hs
+++ b/src/Control/Lens/Internal/Zipper.hs
@@ -53,7 +53,6 @@ import Data.Profunctor.Unsafe
 -- >>> import Control.Lens
 -- >>> import Data.Char
 
-{-# ANN module "HLint: ignore Use foldl" #-}
 
 ------------------------------------------------------------------------------
 -- * Jacket
diff --git a/src/Control/Lens/Iso.hs b/src/Control/Lens/Iso.hs
index 1152af4..5b680ec 100644
--- a/src/Control/Lens/Iso.hs
+++ b/src/Control/Lens/Iso.hs
@@ -82,7 +82,6 @@ import Data.Maybe
 import Data.Profunctor
 import Data.Profunctor.Unsafe
 
-{-# ANN module "HLint: ignore Use on" #-}
 
 -- $setup
 -- >>> :set -XNoOverloadedStrings
diff --git a/src/Control/Lens/Lens.hs b/src/Control/Lens/Lens.hs
index b26cc06..cf8d688 100644
--- a/src/Control/Lens/Lens.hs
+++ b/src/Control/Lens/Lens.hs
@@ -126,8 +126,6 @@ import Data.Profunctor.Rep
 import Data.Profunctor.Unsafe
 import Data.Void
 
-{-# ANN module "HLint: ignore Use ***" #-}
-
 -- $setup
 -- >>> :set -XNoOverloadedStrings
 -- >>> import Control.Lens
diff --git a/src/Control/Lens/Operators.hs b/src/Control/Lens/Operators.hs
index 11868e0..4e77cd0 100644
--- a/src/Control/Lens/Operators.hs
+++ b/src/Control/Lens/Operators.hs
@@ -108,4 +108,3 @@ import Control.Lens.Review
 import Control.Lens.Setter
 import Control.Lens.Zipper
 
-{-# ANN module "HLint: ignore Use import/export shortcut" #-}
diff --git a/src/Control/Lens/Plated.hs b/src/Control/Lens/Plated.hs
index a8c4d20..e6b8dea 100644
--- a/src/Control/Lens/Plated.hs
+++ b/src/Control/Lens/Plated.hs
@@ -95,7 +95,6 @@ import           Data.Data.Lens
 import           Data.Monoid
 import           Data.Tree
 
-{-# ANN module "HLint: ignore Reduce duplication" #-}
 
 -- | A 'Plated' type is one where we know how to extract its immediate self-similar children.
 --
diff --git a/src/Control/Lens/Prism.hs b/src/Control/Lens/Prism.hs
index 0f3253f..e60a884 100644
--- a/src/Control/Lens/Prism.hs
+++ b/src/Control/Lens/Prism.hs
@@ -51,7 +51,6 @@ import Data.Void
 import Unsafe.Coerce
 #endif
 
-{-# ANN module "HLint: ignore Use camelCase" #-}
 
 -- $setup
 -- >>> :set -XNoOverloadedStrings
diff --git a/src/Control/Lens/Setter.hs b/src/Control/Lens/Setter.hs
index a1e953f..d9f5b73 100644
--- a/src/Control/Lens/Setter.hs
+++ b/src/Control/Lens/Setter.hs
@@ -87,7 +87,6 @@ import Data.Profunctor
 import Data.Profunctor.Rep
 import Data.Profunctor.Unsafe
 
-{-# ANN module "HLint: ignore Avoid lambda" #-}
 
 -- $setup
 -- >>> import Control.Lens
diff --git a/src/Data/Data/Lens.hs b/src/Data/Data/Lens.hs
index cf1e7c9..fdb0e8f 100644
--- a/src/Data/Data/Lens.hs
+++ b/src/Data/Data/Lens.hs
@@ -65,9 +65,6 @@ import           Data.Monoid
 import           GHC.Exts (realWorld#)
 #endif
 
-{-# ANN module "HLint: ignore Eta reduce" #-}
-{-# ANN module "HLint: ignore Use foldl" #-}
-{-# ANN module "HLint: ignore Reduce duplication" #-}
 
 -- $setup
 -- >>> :set -XNoOverloadedStrings
-- 
1.7.10.4

From 88646e0992887d03b01407cf585818a35143558c Mon Sep 17 00:00:00 2001
From: Joey Hess <j...@kitenet.net>
Date: Mon, 14 Oct 2013 23:43:12 -0400
Subject: [PATCH 2/3] packaging changes

---
 debian/control |   14 +++++++-------
 debian/rules   |    5 +++++
 2 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/debian/control b/debian/control
index 364ee63..fa467a6 100644
--- a/debian/control
+++ b/debian/control
@@ -26,9 +26,9 @@ Build-Depends: debhelper (>= 9)
  , libghc-distributive-dev (>> 0.3)
  , libghc-distributive-dev (<< 1)
  , libghc-distributive-prof
- , libghc-generic-deriving-dev (>> 1.4) [!armel]
- , libghc-generic-deriving-dev (<< 1.6) [!armel]
- , libghc-generic-deriving-prof [!armel]
+ , libghc-generic-deriving-dev (>> 1.4) [!armel !armhf !mips !mipsel !s390 !s390x]
+ , libghc-generic-deriving-dev (<< 1.6) [!armel !armhf !mips !mipsel !s390 !s390x]
+ , libghc-generic-deriving-prof [!armel !armhf !mips !mipsel !s390 !s390x]
  , libghc-hashable-dev (>> 1.1.2.3)
  , libghc-hashable-dev (<< 1.3)
  , libghc-hashable-prof
@@ -47,9 +47,9 @@ Build-Depends: debhelper (>= 9)
  , libghc-profunctors-dev (>> 3.2)
  , libghc-profunctors-dev (<< 4)
  , libghc-profunctors-prof
- , libghc-reflection-dev (>> 1.1.6)
- , libghc-reflection-dev (<< 2)
- , libghc-reflection-prof
+ , libghc-reflection-dev (>> 1.1.6) [!armel !armhf !mips !mipsel !s390 !s390x]
+ , libghc-reflection-dev (<< 2) [!armel !armhf !mips !mipsel !s390 !s390x]
+ , libghc-reflection-prof [!armel !armhf !mips !mipsel !s390 !s390x]
  , libghc-semigroupoids-dev (>> 3.0.2)
  , libghc-semigroupoids-dev (<< 4)
  , libghc-semigroupoids-prof
@@ -82,7 +82,7 @@ Build-Depends: debhelper (>= 9)
  , libghc-test-framework-dev (>> 0.6)
  , libghc-test-framework-quickcheck2-dev (>> 0.2)
  , libghc-test-framework-hunit-dev (>> 0.2)
- , libghc-test-framework-th-dev (>> 0.2)
+ , libghc-test-framework-th-dev (>> 0.2) [!armel !armhf !mips !mipsel !s390 !s390x]
  , libghc-doctest-dev (>> 0.9.1)
  , libghc-simple-reflect-dev (>> 0.3.1)
 Build-Depends-Indep: ghc-doc
diff --git a/debian/rules b/debian/rules
index 8ec1809..8ad7013 100755
--- a/debian/rules
+++ b/debian/rules
@@ -10,3 +10,8 @@ ifeq ($(DEB_HOST_ARCH),sparc)
 	# Disable tests that require SMP.
 	DEB_SETUP_GHC_CONFIGURE_ARGS := -f-test-hunit -f-test-properties
 endif
+
+ifeq ($(shell if [ ! -e /usr/bin/ghci ]; then echo 0; fi),0)
+	DEB_SETUP_GHC_CONFIGURE_ARGS := -fwithout-th -f-test-hunit -f-test-properties -f-test-doctests
+endif
+
-- 
1.7.10.4

From 6db5884760a02adc15e5777a675c32a7ab926b8b Mon Sep 17 00:00:00 2001
From: Joey Hess <j...@kitenet.net>
Date: Mon, 14 Oct 2013 23:43:57 -0400
Subject: [PATCH 3/3] add without-th flag

---
 lens.cabal                             |   28 +++++++++++++++++++++-------
 src/Control/Lens/Internal/Exception.hs |    6 ++++++
 2 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/lens.cabal b/lens.cabal
index 8714cdd..7c31cab 100644
--- a/lens.cabal
+++ b/lens.cabal
@@ -133,6 +133,11 @@ flag dump-splices
   default: False
   manual: True
 
+-- Avoid bulding modules that need TH
+flag without-th
+  default: False
+  manual: True
+
 -- You can disable the doctests test suite with -f-test-doctests
 flag test-doctests
   default: True
@@ -175,7 +180,6 @@ library
     containers                >= 0.4.0    && < 0.6,
     distributive              >= 0.3      && < 1,
     filepath                  >= 1.2.0.0  && < 1.4,
-    generic-deriving          >= 1.4      && < 1.6,
     ghc-prim,
     hashable                  >= 1.1.2.3  && < 1.3,
     MonadCatchIO-transformers >= 0.3      && < 0.4,
@@ -183,7 +187,6 @@ library
     parallel                  >= 3.1.0.1  && < 3.3,
     profunctors               >= 3.2      && < 4,
     profunctor-extras         >= 3.3      && < 4,
-    reflection                >= 1.1.6    && < 2,
     semigroupoids             >= 3.0.2    && < 4,
     semigroups                >= 0.8.4    && < 1,
     split                     == 0.2.*,
@@ -237,7 +240,6 @@ library
     Control.Lens.Review
     Control.Lens.Setter
     Control.Lens.Simple
-    Control.Lens.TH
     Control.Lens.Traversal
     Control.Lens.Tuple
     Control.Lens.Type
@@ -268,14 +270,23 @@ library
     Data.Typeable.Lens
     Data.Vector.Lens
     Data.Vector.Generic.Lens
-    Generics.Deriving.Lens
-    GHC.Generics.Lens
     System.Exit.Lens
     System.FilePath.Lens
-    System.IO.Error.Lens
-    Language.Haskell.TH.Lens
     Numeric.Lens
 
+  if flag(without-th)
+    cpp-options: -DDISABLE_TEMPLATE_HASKELL
+  else
+    build-depends:
+      generic-deriving          >= 1.4      && < 1.6,
+      reflection                >= 1.1.6    && < 2
+    exposed-modules:
+      Control.Lens.TH
+      Language.Haskell.TH.Lens
+      Generics.Deriving.Lens
+      GHC.Generics.Lens
+      System.IO.Error.Lens
+
   if flag(safe)
     cpp-options: -DSAFE=1
 
@@ -308,6 +319,9 @@ test-suite templates
   build-depends: base, lens
   ghc-options: -Wall -threaded
   hs-source-dirs: tests
+  
+  if flag(without-th)
+    buildable: False
 
   if flag(dump-splices)
     ghc-options: -ddump-splices
diff --git a/src/Control/Lens/Internal/Exception.hs b/src/Control/Lens/Internal/Exception.hs
index 387203e..43a59fa 100644
--- a/src/Control/Lens/Internal/Exception.hs
+++ b/src/Control/Lens/Internal/Exception.hs
@@ -34,7 +34,9 @@ import Control.Monad.CatchIO as CatchIO
 import Data.IORef
 import Data.Monoid
 import Data.Proxy
+#ifndef DISABLE_TEMPLATE_HASKELL
 import Data.Reflection
+#endif
 import Data.Typeable
 import System.IO.Unsafe
 
@@ -128,6 +130,7 @@ class Handleable e (m :: * -> *) (h :: * -> *) | h -> e m where
   handler_ l = handler l . const
   {-# INLINE handler_ #-}
 
+#ifndef DISABLE_TEMPLATE_HASKELL
 instance Handleable SomeException IO Exception.Handler where
   handler = handlerIO
 
@@ -139,6 +142,7 @@ handlerIO l f = reify (preview l) $ \ (_ :: Proxy s) -> Exception.Handler (\(Han
 
 handlerCatchIO :: forall m a r. Getting (First a) SomeException a -> (a -> m r) -> CatchIO.Handler m r
 handlerCatchIO l f = reify (preview l) $ \ (_ :: Proxy s) -> CatchIO.Handler (\(Handling a :: Handling a s m) -> f a)
+#endif
 
 ------------------------------------------------------------------------------
 -- Helpers
@@ -172,8 +176,10 @@ instance Show (Handling a s m) where
   showsPrec d _ = showParen (d > 10) $ showString "Handling ..."
   {-# INLINE showsPrec #-}
 
+#ifndef DISABLE_TEMPLATE_HASKELL
 instance Reifies s (SomeException -> Maybe a) => Exception (Handling a s m) where
   toException _ = SomeException HandlingException
   {-# INLINE toException #-}
   fromException = fmap Handling . reflect (Proxy :: Proxy s)
   {-# INLINE fromException #-}
+#endif
-- 
1.7.10.4

Attachment: signature.asc
Description: Digital signature

Reply via email to