From 53cfd1d132d95aad49097e08a2630b44dc2cdd7c Mon Sep 17 00:00:00 2001 From: Mike Sperber Date: Wed, 15 Apr 2020 13:00:12 +0200 Subject: [PATCH] haskell-tensorflow: unbreak - get the current Git head of haskell-tensorflow - adjust dependencies --- .../configuration-tensorflow.nix | 110 ++++++++----- .../patches/proto-lens-0.2.2.0.patch | 23 --- .../patches/proto-lens-0.5.1.0.patch | 23 +++ .../patches/proto-lens-protoc-0.2.2.3.patch | 51 ------ .../patches/proto-lens-setup-0.4.0.2.patch | 154 ++++++++++++++++++ 5 files changed, 247 insertions(+), 114 deletions(-) delete mode 100644 pkgs/development/haskell-modules/patches/proto-lens-0.2.2.0.patch create mode 100644 pkgs/development/haskell-modules/patches/proto-lens-0.5.1.0.patch delete mode 100644 pkgs/development/haskell-modules/patches/proto-lens-protoc-0.2.2.3.patch create mode 100644 pkgs/development/haskell-modules/patches/proto-lens-setup-0.4.0.2.patch diff --git a/pkgs/development/haskell-modules/configuration-tensorflow.nix b/pkgs/development/haskell-modules/configuration-tensorflow.nix index 7aba8e3a574b8b..ba0acd6b6d693a 100644 --- a/pkgs/development/haskell-modules/configuration-tensorflow.nix +++ b/pkgs/development/haskell-modules/configuration-tensorflow.nix @@ -4,62 +4,91 @@ with haskellLib; self: super: let + # This contains updates to the dependencies, without which it would + # be even more work to get it to build. + # As of 2020-04, there's no new release in sight, which is why we're + # pulling from Github. tensorflow-haskell = pkgs.fetchFromGitHub { owner = "tensorflow"; repo = "haskell"; - rev = "85bf0bb12cecfcdfcf31dea43b67cbe44576f685"; - sha256 = "1xbwc8y4a7n2163g746dpyh1q86rbxaw3d41kcy1mbhvmfqq56x7"; + rev = "0f322b2e0611cbe7011c84ba8b6cb822e4725ebc"; + sha256 = "15gn66i547q20sd50ixwm6yk1g00syfgxp8xa6xjd0i3kcsl3gs1"; fetchSubmodules = true; }; - setSourceRoot = dir: drv: drv.overrideAttrs (_oldAttrs: {sourceRoot = "source/${dir}";}); + setTensorflowSourceRoot = dir: drv: + (overrideCabal drv (drv: { src = tensorflow-haskell; })) + .overrideAttrs (_oldAttrs: {sourceRoot = "source/${dir}";}); - proto-lens = self.proto-lens; - proto-lens-protoc = self.proto-lens-protoc; - proto-lens-protobuf-types = self.proto-lens-protobuf-types; - mainland-pretty = self.mainland-pretty_0_6_2; + proto-lens = self.proto-lens_0_5_1_0; + proto-lens-protoc = self.proto-lens-protoc_0_5_0_0; + proto-lens-runtime = self.proto-lens-runtime_0_5_0_0; + proto-lens-protobuf-types = self.proto-lens-protobuf-types_0_5_0_0; + proto-lens-setup = self.proto-lens-setup_0_4_0_2; + lens-family = self.lens-family_1_2_3; in { - proto-lens = appendPatch super.proto-lens ./patches/proto-lens-0.2.2.0.patch; - proto-lens-descriptors = doJailbreak (super.proto-lens-descriptors.override { - inherit proto-lens; - lens-labels = self.lens-labels_0_1_0_2; + lens-family_1_2_3 = super.lens-family_1_2_3.override { + lens-family-core = self.lens-family-core_1_2_3; + }; + + proto-lens_0_5_1_0 = (appendPatch (doJailbreak super.proto-lens_0_5_1_0) ./patches/proto-lens-0.5.1.0.patch).override { + inherit lens-family; + }; + + proto-lens-runtime_0_5_0_0 = doJailbreak (super.proto-lens-runtime_0_5_0_0.override { + inherit lens-family proto-lens; }); - proto-lens-protoc = appendPatch (addBuildDepend (super.proto-lens-protoc.override { - inherit proto-lens; - }) self.semigroups) ./patches/proto-lens-protoc-0.2.2.3.patch; - proto-lens-protobuf-types = doJailbreak (super.proto-lens-protobuf-types.override { - inherit proto-lens proto-lens-protoc; + + proto-lens-protoc_0_5_0_0 = doJailbreak (super.proto-lens-protoc_0_5_0_0.override { + inherit lens-family proto-lens; + haskell-src-exts = self.haskell-src-exts_1_19_1; }); + proto-lens-setup_0_4_0_2 = appendPatch (doJailbreak (super.proto-lens-setup_0_4_0_2.override { + inherit proto-lens-protoc; + })) ./patches/proto-lens-setup-0.4.0.2.patch; - lens-labels_0_1_0_2 = doJailbreak super.lens-labels_0_1_0_2; + proto-lens-protobuf-types_0_5_0_0 = doJailbreak (super.proto-lens-protobuf-types_0_5_0_0.override { + inherit lens-family proto-lens proto-lens-runtime proto-lens-setup; + }); - haskell-src-exts_1_19_1 = appendPatch (doJailbreak super.haskell-src-exts_1_19_1) ( + haskell-src-exts_1_19_1 = appendPatches (doJailbreak super.haskell-src-exts_1_19_1) [ # Adapt to the Semigroup–Monoid Proposal (enables building on GHC >= 8.4) - pkgs.fetchpatch { - url = "https://github.com/haskell-suite/haskell-src-exts/commit/258e072fe9e37f94360b7488b58ea2832843bbb8.patch"; - sha256 = "0ja6ai41v9plinlhjwja282m6ahn6mw4xi79np0jxqk83cg0z1ff"; - } - ); + (pkgs.fetchpatch { + url = https://github.com/haskell-suite/haskell-src-exts/commit/258e072fe9e37f94360b7488b58ea2832843bbb8.patch; + sha256 = "0ja6ai41v9plinlhjwja282m6ahn6mw4xi79np0jxqk83cg0z1ff"; + }) + # Adapt to MonadFail proposal (enables building on GHC >= 8.8) + (pkgs.fetchpatch { + url = https://gist.githubusercontent.com/mikesperber/0f2addaf3fbe97ffb4a5234d8711ba41/raw/e09e20998283c7195e82d546ba9266d290eb000d/gistfile1.txt; + sha256 = "18clvli7vpqsqlf2f3qidn71738j9zdlpana6wha3x0dxwan5ly0"; + }) ]; - tensorflow-proto = super.tensorflow-proto.override { - inherit proto-lens proto-lens-protobuf-types; + tensorflow-proto = (setTensorflowSourceRoot "tensorflow-proto" super.tensorflow-proto).override { + inherit proto-lens proto-lens-runtime proto-lens-setup proto-lens-protobuf-types; }; - tensorflow = super.tensorflow.override { - inherit mainland-pretty proto-lens; + + tensorflow = (setTensorflowSourceRoot "tensorflow" super.tensorflow).override { + inherit lens-family proto-lens; + # the "regular" Python package does not seem to include the binary library + libtensorflow = pkgs.libtensorflow-bin; }; - tensorflow-core-ops = super.tensorflow-core-ops.override { - inherit mainland-pretty proto-lens; + + tensorflow-core-ops = (setTensorflowSourceRoot "tensorflow-core-ops" super.tensorflow-core-ops).override { + inherit lens-family proto-lens; }; - tensorflow-logging = super.tensorflow-logging.override { - inherit proto-lens; + + tensorflow-logging = (setTensorflowSourceRoot "tensorflow-logging" super.tensorflow-logging).override { + inherit lens-family proto-lens; }; - tensorflow-mnist = overrideCabal (super.tensorflow-mnist.override { - inherit proto-lens; + + tensorflow-mnist = (setTensorflowSourceRoot "tensorflow-mnist" super.tensorflow-mnist).override { + inherit lens-family proto-lens; # https://github.com/tensorflow/haskell/issues/215 tensorflow-mnist-input-data = self.tensorflow-mnist-input-data; - }) (_drv: { broken = false; }); - tensorflow-mnist-input-data = setSourceRoot "tensorflow-mnist-input-data" (super.callPackage ( + }; + + tensorflow-mnist-input-data = setTensorflowSourceRoot "tensorflow-mnist-input-data" (super.callPackage ( { mkDerivation, base, bytestring, Cabal, cryptonite, directory , filepath, HTTP, network-uri, stdenv }: @@ -80,7 +109,6 @@ in mkDerivation { pname = "tensorflow-mnist-input-data"; version = "0.1.0.0"; - src = tensorflow-haskell; enableSeparateDataOutput = true; setupHaskellDepends = [ base bytestring Cabal cryptonite directory filepath HTTP @@ -95,10 +123,12 @@ in license = stdenv.lib.licenses.asl20; } ) {}); - tensorflow-opgen = super.tensorflow-opgen.override { - inherit mainland-pretty proto-lens; + + tensorflow-opgen = (setTensorflowSourceRoot "tensorflow-opgen" super.tensorflow-opgen).override { + inherit lens-family proto-lens; }; - tensorflow-ops = super.tensorflow-ops.override { - inherit proto-lens; + + tensorflow-ops = (setTensorflowSourceRoot "tensorflow-ops" super.tensorflow-ops).override { + inherit lens-family proto-lens; }; } diff --git a/pkgs/development/haskell-modules/patches/proto-lens-0.2.2.0.patch b/pkgs/development/haskell-modules/patches/proto-lens-0.2.2.0.patch deleted file mode 100644 index 100a828a501af3..00000000000000 --- a/pkgs/development/haskell-modules/patches/proto-lens-0.2.2.0.patch +++ /dev/null @@ -1,23 +0,0 @@ -diff -Naur proto-lens-0.2.2.0/proto-lens.cabal proto-lens-0.2.2.0-patched/proto-lens.cabal ---- proto-lens-0.2.2.0/proto-lens.cabal 2018-08-13 18:05:41.704823370 +0200 -+++ proto-lens-0.2.2.0-patched/proto-lens.cabal 2018-08-13 18:07:42.352372300 +0200 -@@ -33,7 +33,7 @@ - Data.ProtoLens.Encoding.Wire - Data.ProtoLens.TextFormat.Parser - build-depends: attoparsec == 0.13.* -- , base >= 4.8 && < 4.11 -+ , base >= 4.8 - , bytestring == 0.10.* - , containers == 0.5.* - , data-default-class >= 0.0 && < 0.2 -diff -Naur proto-lens-0.2.2.0/src/Data/ProtoLens/TextFormat.hs proto-lens-0.2.2.0-patched/src/Data/ProtoLens/TextFormat.hs ---- proto-lens-0.2.2.0/src/Data/ProtoLens/TextFormat.hs 2017-04-28 02:16:46.000000000 +0200 -+++ proto-lens-0.2.2.0-patched/src/Data/ProtoLens/TextFormat.hs 2018-08-13 18:08:06.371486594 +0200 -@@ -17,6 +17,7 @@ - readMessageOrDie, - ) where - -+import Prelude hiding ((<>)) - import Lens.Family2 ((&),(^.),(.~), set, over) - import Control.Arrow (left) - import qualified Data.ByteString diff --git a/pkgs/development/haskell-modules/patches/proto-lens-0.5.1.0.patch b/pkgs/development/haskell-modules/patches/proto-lens-0.5.1.0.patch new file mode 100644 index 00000000000000..b50d3f1cdbfc7d --- /dev/null +++ b/pkgs/development/haskell-modules/patches/proto-lens-0.5.1.0.patch @@ -0,0 +1,23 @@ +diff --git a/src/Data/ProtoLens/Encoding/Parser/Internal.hs b/src/Data/ProtoLens/Encoding/Parser/Internal.hs +index 30eeaad..f2703e7 100644 +--- a/src/Data/ProtoLens/Encoding/Parser/Internal.hs ++++ b/src/Data/ProtoLens/Encoding/Parser/Internal.hs +@@ -1,4 +1,5 @@ + {-# LANGUAGE LambdaCase #-} ++{-# LANGUAGE CPP #-} + -- | Definition of the parsing monad, plus internal + -- unsafe functions. + module Data.ProtoLens.Encoding.Parser.Internal +@@ -36,8 +37,11 @@ instance Applicative Parser where + (<*>) = ap + + instance Monad Parser where +- fail s = Parser $ \_ _ -> return $ ParseFailure s + return = pure + Parser f >>= g = Parser $ \end pos -> f end pos >>= \case + ParseSuccess pos' x -> unParser (g x) end pos' + ParseFailure s -> return $ ParseFailure s ++#if MIN_VERSION_base(4,13,0) ++instance MonadFail Parser where ++#endif ++ fail s = Parser $ \_ _ -> return $ ParseFailure s diff --git a/pkgs/development/haskell-modules/patches/proto-lens-protoc-0.2.2.3.patch b/pkgs/development/haskell-modules/patches/proto-lens-protoc-0.2.2.3.patch deleted file mode 100644 index 87fd2aeab21bc5..00000000000000 --- a/pkgs/development/haskell-modules/patches/proto-lens-protoc-0.2.2.3.patch +++ /dev/null @@ -1,51 +0,0 @@ -diff -Naur proto-lens-protoc-0.2.2.3/proto-lens-protoc.cabal proto-lens-protoc-0.2.2.3-patched/proto-lens-protoc.cabal ---- proto-lens-protoc-0.2.2.3/proto-lens-protoc.cabal 2018-07-21 22:55:12.041698876 +0200 -+++ proto-lens-protoc-0.2.2.3-patched/proto-lens-protoc.cabal 2018-08-13 19:44:44.993147985 +0200 -@@ -37,8 +37,8 @@ - default-language: Haskell2010 - hs-source-dirs: src - build-depends: -- Cabal >= 1.22 && < 2.1 -- , base >= 4.8 && < 4.11 -+ Cabal >= 1.22 -+ , base >= 4.8 - , bytestring == 0.10.* - , containers == 0.5.* - , data-default-class >= 0.0 && < 0.2 -@@ -53,6 +53,7 @@ - , proto-lens == 0.2.2.* - , proto-lens-descriptors == 0.2.2.* - , text == 1.2.* -+ , semigroups - reexported-modules: - -- Modules that are needed by the generated Haskell files. - -- For forwards compatibility, reexport them as new module names so that -@@ -76,7 +77,7 @@ - main-is: protoc-gen-haskell.hs - - build-depends: -- base >= 4.8 && < 4.11 -+ base >= 4.8 - , bytestring == 0.10.* - , containers == 0.5.* - , data-default-class >= 0.0 && < 0.2 -diff -Naur proto-lens-protoc-0.2.2.3/src/Data/ProtoLens/Compiler/Definitions.hs proto-lens-protoc-0.2.2.3-patched/src/Data/ProtoLens/Compiler/Definitions.hs ---- proto-lens-protoc-0.2.2.3/src/Data/ProtoLens/Compiler/Definitions.hs 2017-08-07 06:52:21.000000000 +0200 -+++ proto-lens-protoc-0.2.2.3-patched/src/Data/ProtoLens/Compiler/Definitions.hs 2018-08-13 19:14:07.240505220 +0200 -@@ -35,6 +35,7 @@ - import qualified Data.Map as Map - import Data.Maybe (fromMaybe) - import Data.Monoid -+import qualified Data.Semigroup as Semigroup - import qualified Data.Set as Set - import Data.String (IsString(..)) - import Data.Text (Text, cons, splitOn, toLower, uncons, unpack) -@@ -139,7 +140,7 @@ - -- a 'Symbol' is used to construct both the type-level argument to - -- @HasLens@ and the name of the function @foo@. - newtype Symbol = Symbol String -- deriving (Eq, Ord, IsString, Monoid) -+ deriving (Eq, Ord, IsString, Semigroup.Semigroup, Monoid) - - nameFromSymbol :: Symbol -> Name - nameFromSymbol (Symbol s) = fromString s diff --git a/pkgs/development/haskell-modules/patches/proto-lens-setup-0.4.0.2.patch b/pkgs/development/haskell-modules/patches/proto-lens-setup-0.4.0.2.patch new file mode 100644 index 00000000000000..a95df00e5dbf60 --- /dev/null +++ b/pkgs/development/haskell-modules/patches/proto-lens-setup-0.4.0.2.patch @@ -0,0 +1,154 @@ +diff --git a/src/Data/ProtoLens/Setup.hs b/src/Data/ProtoLens/Setup.hs +index e68f32b..f381199 100644 +--- a/src/Data/ProtoLens/Setup.hs ++++ b/src/Data/ProtoLens/Setup.hs +@@ -41,9 +41,6 @@ import Distribution.PackageDescription + , exeName + , exposedModules + , extraSrcFiles +-#if !MIN_VERSION_Cabal(2,0,0) +- , hsSourceDirs +-#endif + #if MIN_VERSION_Cabal(2,4,0) + , specVersion + #endif +@@ -53,7 +50,7 @@ import Distribution.PackageDescription + , testBuildInfo + , testName + ) +-import qualified Distribution.Simple.BuildPaths as BuildPaths ++import Distribution.Simple.BuildPaths (autogenComponentModulesDir) + import Distribution.Simple.InstallDirs (datadir) + import Distribution.Simple.LocalBuildInfo + ( LocalBuildInfo(..) +@@ -61,9 +58,10 @@ import Distribution.Simple.LocalBuildInfo + , ComponentName(..) + , ComponentLocalBuildInfo + , componentPackageDeps +-#if MIN_VERSION_Cabal(2,0,0) + , allComponentsInBuildOrder + , componentNameMap ++#if MIN_VERSION_Cabal(3,0,0) ++ , LibraryName(..) + #endif + ) + import qualified Distribution.Simple.PackageIndex as PackageIndex +@@ -205,16 +203,6 @@ generatingSpecificProtos root getProtos hooks = hooks + { buildHook = \p l h f -> generate l >> buildHook hooks p l h f + , haddockHook = \p l h f -> generate l >> haddockHook hooks p l h f + , replHook = \p l h f args -> generate l >> replHook hooks p l h f args +-#if !MIN_VERSION_Cabal(2,0,0) +- -- Older versions of Cabal don't support the autogen-modules field. +- -- Work around it by manually generating the modules and putting them +- -- in a place where `cabal sdist` will pick them up. +- , sDistHook = \p maybe_l h f -> case maybe_l of +- Nothing -> error "Can't run protoc; run 'cabal configure' first." +- Just l -> do +- generate l +- sDistHook hooks (fudgePackageDesc l p) maybe_l h f +-#endif + , postCopy = \a flags pkg lbi -> do + let verb = fromFlag $ copyVerbosity flags + let destDir = datadir (absoluteInstallDirs pkg lbi +@@ -316,39 +304,6 @@ copyProtosToDataDir verb root destDir files = do + protoLensImportsPrefix :: FilePath + protoLensImportsPrefix = "proto-lens-imports" + +-#if !MIN_VERSION_Cabal(2,0,0) +--- | Add the autogen directory to the hs-source-dirs of all the targets in the +--- .cabal file. Used to fool 'sdist' by pointing it to the generated source +--- files. +-fudgePackageDesc :: LocalBuildInfo -> PackageDescription -> PackageDescription +-fudgePackageDesc lbi p = p +- { library = +- (\lib -> lib { libBuildInfo = fudgeBuildInfo CLibName $ libBuildInfo lib }) +- <$> library p +- , executables = +- (\exe -> exe { buildInfo = fudgeBuildInfo (CExeName $ exeName exe) +- $ buildInfo exe }) +- <$> executables p +- , testSuites = +- (\test -> test { testBuildInfo = fudgeBuildInfo (CTestName $ testName test) +- $ testBuildInfo test }) +- <$> testSuites p +- , benchmarks = +- (\bench -> bench { benchmarkBuildInfo = +- fudgeBuildInfo (CBenchName $ benchmarkName bench) +- $ benchmarkBuildInfo bench }) +- <$> benchmarks p +- } +- where +- comps = allComponents lbi +- fudgeBuildInfo n bi +- | Just compLBI <- Map.lookup n comps +- = bi { hsSourceDirs = autogenComponentModulesDir lbi compLBI +- : hsSourceDirs bi } +- | otherwise = bi -- Could happen if a component isn't active; try +- -- anyway and see whether Cabal complains later on. +-#endif +- + -- | Returns whether the @root@ is a parent folder of @f@. + isSubdirectoryOf :: FilePath -> FilePath -> Bool + isSubdirectoryOf root f +@@ -423,15 +378,18 @@ collectActiveModules + collectActiveModules l = map (\(n, c) -> (c, f n)) $ Map.toList $ allComponents l + where + p = localPkgDescr l +- f CLibName = maybeToList (library p) >>= ++#if MIN_VERSION_Cabal(3,0,0) ++ f (CLibName LMainLibName) ++#else ++ f CLibName ++#endif ++ = maybeToList (library p) >>= + \lib -> exposedModules lib + ++ otherModules (libBuildInfo lib) + f (CExeName n) = otherModules . buildInfo $ exes Map.! n + f (CTestName n) = otherModules . testBuildInfo $ tests Map.! n + f (CBenchName n) = otherModules . benchmarkBuildInfo $ benchs Map.! n +-#if MIN_VERSION_Cabal(2,0,0) + f _ = [] -- TODO: other lib kinds; for now just suppress the warning +-#endif + exes = Map.fromList [(exeName e, e) | e <- executables p] + tests = Map.fromList [(testName e, e) | e <- testSuites p] + benchs = Map.fromList [(benchmarkName e, e) | e <- benchmarks p] +@@ -441,22 +399,14 @@ collectActiveModules l = map (\(n, c) -> (c, f n)) $ Map.toList $ allComponents + + -- | List all the packages that this one depends on. + collectDeps :: LocalBuildInfo -> [InstalledPackageInfo.InstalledPackageInfo] +-#if MIN_VERSION_Cabal(2,0,0) + collectDeps l = do + c <- allComponentsInBuildOrder l + (i,_) <- componentPackageDeps c + Just p <- [PackageIndex.lookupUnitId (installedPkgs l) i] + return p +-#else +-collectDeps l = do +- (_, c ,_) <- componentsConfigs l +- (_, i) <- componentPackageDeps c +- PackageIndex.lookupSourcePackageId (installedPkgs l) i +-#endif + + -- | All the components that will be built by this Cabal command. + allComponents :: LocalBuildInfo -> Map.Map ComponentName ComponentLocalBuildInfo +-#if MIN_VERSION_Cabal(2,0,0) + allComponents l = fmap requireOne $ componentNameMap l + where + -- TODO: this doesn't support Backpack, which can have more than one +@@ -464,16 +414,3 @@ allComponents l = fmap requireOne $ componentNameMap l + requireOne [x] = x + requireOne xs = error $ "Data.ProtoLens.Setup.allComponents: expected one " + ++ "component per name, got " ++ show xs +- +-#else +-allComponents l = Map.fromList [(c, b) | (c, b, _) <- componentsConfigs l] +-#endif +- +--- | Get the component-level "autogen" directory where we're putting the +--- generated .hs files. (For Cabal-1.0, use the shared 'BuildPaths.autogenModulesDir'.) +-autogenComponentModulesDir :: LocalBuildInfo -> ComponentLocalBuildInfo -> FilePath +-#if MIN_VERSION_Cabal(2,0,0) +-autogenComponentModulesDir = BuildPaths.autogenComponentModulesDir +-#else +-autogenComponentModulesDir lbi _ = BuildPaths.autogenModulesDir lbi +-#endif