diff --git a/Setup.hs b/Setup.hs index 4cf4c9c..3ca9c28 100644 --- a/Setup.hs +++ b/Setup.hs @@ -1,17 +1,93 @@ +import Control.Exception (throw) +import Control.Monad (forM_, when) +import Data.Maybe (isNothing) import Distribution.PackageDescription import Distribution.Simple import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..), localPkgDescr) import Distribution.Simple.PreProcess +import Distribution.Simple.Program.Find + ( defaultProgramSearchPath + , findProgramOnSearchPath + ) import Distribution.Simple.Setup -import System.Directory (getCurrentDirectory) +import Distribution.Simple.Utils + ( IODataMode(IODataModeBinary) + , maybeExit + , rawSystemStdInOut + ) +import Distribution.Verbosity (Verbosity) +import qualified Distribution.Verbosity as Verbosity +import System.Directory + ( XdgDirectory(..) + , copyFile + , createDirectory + , createDirectoryIfMissing + , doesDirectoryExist + , doesFileExist + , getCurrentDirectory + , getDirectoryContents + , getHomeDirectory + , getXdgDirectory + ) +import System.Environment import System.FilePath (()) +import Text.Regex +import Text.Regex.Base main :: IO () main = defaultMainWithHooks hooks where hooks = simpleUserHooks - {confHook = \a flags -> confHook simpleUserHooks a flags >>= rsAddDirs} + { preConf = + \_ flags -> do + prepDeps (fromFlag $ configVerbosity flags) + pure emptyHookedBuildInfo + --, confHook = \a flags -> confHook simpleUserHooks a flags >>= rsAddDirs + } + +execCargo :: Verbosity -> String -> [String] -> IO () +execCargo verbosity command args = do + cargoPath <- + findProgramOnSearchPath Verbosity.silent defaultProgramSearchPath "cargo" + dir <- getCurrentDirectory + let cargoExec = + case cargoPath of + Just (p, _) -> p + Nothing -> "cargo" + cargoArgs = command : args + workingDir = Just (dir rsFolder) + thirdComponent (_, _, c) = c + maybeExit . fmap thirdComponent $ + rawSystemStdInOut + verbosity + cargoExec + cargoArgs + workingDir + Nothing + Nothing + IODataModeBinary + +rsMake :: Verbosity -> IO () +rsMake verbosity = do + execCargo verbosity "cbuild" [] + +prepDeps :: Verbosity -> IO () +prepDeps verbosity = do + ldPath <- lookupEnv "LD_LIBRARY_PATH" + pkgPath <- lookupEnv "PKG_CONFIG_PATH" + if maybe False (matchTest (mkRegex ".*zcash-haskell.*")) ldPath && + maybe False (matchTest (mkRegex ".*zcash-haskell.*")) pkgPath + then do + execCargo verbosity "cbuild" [] + localData <- getXdgDirectory XdgData "zcash-haskell" + createDirectoryIfMissing True localData + dir <- getCurrentDirectory + let rustLibDir = + dir rsFolder "target/x86_64-unknown-linux-gnu/debug" + copyDir rustLibDir localData + else throw $ + userError "Paths not set correctly, please run the 'configure' script." rsFolder :: FilePath rsFolder = "zcash-haskell/librustzcash-wrapper" @@ -32,3 +108,24 @@ rsAddDirs lbi' = do , extraLibDirs = rustLibDir : extraLibDirs libBuild } pure $ updateLbi lbi' + +copyDir :: FilePath -> FilePath -> IO () +copyDir src dst = do + whenM (not <$> doesDirectoryExist src) $ + throw (userError "source does not exist") + --whenM (doesFileOrDirectoryExist dst) $ + --throw (userError "destination already exists") + createDirectoryIfMissing True dst + content <- getDirectoryContents src + let xs = filter (`notElem` [".", ".."]) content + forM_ xs $ \name -> do + let srcPath = src name + let dstPath = dst name + isDirectory <- doesDirectoryExist srcPath + if isDirectory + then copyDir srcPath dstPath + else copyFile srcPath dstPath + where + doesFileOrDirectoryExist x = orM [doesDirectoryExist x, doesFileExist x] + orM xs = or <$> sequence xs + whenM s r = s >>= flip when r diff --git a/configure b/configure new file mode 100755 index 0000000..df9fc8d --- /dev/null +++ b/configure @@ -0,0 +1,6 @@ +#!/bin/bash + +echo "export PKG_CONFIG_PATH=$HOME/.local/share/zcash-haskell:\$PKG_CONFIG_PATH" | tee -a ~/.bashrc +echo "export LD_LIBRARY_PATH=$HOME/.local/share/zcash-haskell:\$LD_LIBRARY_PATH" | tee -a ~/.bashrc +source ~/.bashrc +cd zcash-haskell && cabal build diff --git a/zcash-haskell b/zcash-haskell index 75cc947..419f041 160000 --- a/zcash-haskell +++ b/zcash-haskell @@ -1 +1 @@ -Subproject commit 75cc947dda2dd24acd166cf17fadd5fb3243c22a +Subproject commit 419f041ca9d1dd921673721c56a673fe1dc058e8 diff --git a/zenith.cabal b/zenith.cabal index 148635e..d3e5b78 100644 --- a/zenith.cabal +++ b/zenith.cabal @@ -1,6 +1,6 @@ cabal-version: 3.0 name: zenith -version: 0.4.2.1 +version: 0.4.3.0 license: MIT license-file: LICENSE author: Rene Vergara @@ -18,10 +18,12 @@ common warnings custom-setup setup-depends: - base >= 4.7 && < 5 - , Cabal >= 3.0.0.0 + base >= 4.12 && < 5 + , Cabal >= 3.2.0.0 , directory >= 1.3.6.0 , filepath >= 1.3.0.2 + , regex-base + , regex-compat library import: warnings @@ -39,7 +41,7 @@ library Clipboard , aeson , array - , base >=4.7 && <5 + , base >=4.12 && <5 , base64-bytestring , brick , bytestring @@ -62,7 +64,8 @@ library , vector , vty , zcash-haskell - default-language: GHC2021 + --pkgconfig-depends: rustzcash_wrapper + default-language: Haskell2010 executable zenith import: warnings @@ -70,7 +73,7 @@ executable zenith hs-source-dirs: app build-depends: - base >=4.7 && <5 + base >=4.12 && <5 , brick , bytestring , configurator @@ -80,8 +83,9 @@ executable zenith , text , time , zenith - extra-libraries: rustzcash_wrapper - default-language: GHC2021 + , zcash-haskell + pkgconfig-depends: rustzcash_wrapper + default-language: Haskell2010 test-suite zenith-tests import: warnings @@ -90,7 +94,7 @@ test-suite zenith-tests hs-source-dirs: test build-depends: - base >=4.7 && <5 + base >=4.12 && <5 , bytestring , configurator , data-default @@ -102,5 +106,5 @@ test-suite zenith-tests , hspec , zcash-haskell , zenith - extra-libraries: rustzcash_wrapper - default-language: GHC2021 + pkgconfig-depends: rustzcash_wrapper + default-language: Haskell2010