Implement new custom `cabal` build

This commit is contained in:
Rene Vergara 2024-02-26 09:52:30 -06:00
parent 74b9de2a9c
commit 12be74fcd6
Signed by: pitmutt
GPG Key ID: 65122AD495A7F5B2
5 changed files with 119 additions and 13 deletions

101
Setup.hs
View File

@ -1,17 +1,93 @@
import Control.Exception (throw)
import Control.Monad (forM_, when)
import Data.Maybe (isNothing)
import Distribution.PackageDescription import Distribution.PackageDescription
import Distribution.Simple import Distribution.Simple
import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..), localPkgDescr) import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..), localPkgDescr)
import Distribution.Simple.PreProcess import Distribution.Simple.PreProcess
import Distribution.Simple.Program.Find
( defaultProgramSearchPath
, findProgramOnSearchPath
)
import Distribution.Simple.Setup 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 System.FilePath ((</>))
import Text.Regex
import Text.Regex.Base
main :: IO () main :: IO ()
main = defaultMainWithHooks hooks main = defaultMainWithHooks hooks
where where
hooks = hooks =
simpleUserHooks 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 :: FilePath
rsFolder = "zcash-haskell/librustzcash-wrapper" rsFolder = "zcash-haskell/librustzcash-wrapper"
@ -32,3 +108,24 @@ rsAddDirs lbi' = do
, extraLibDirs = rustLibDir : extraLibDirs libBuild , extraLibDirs = rustLibDir : extraLibDirs libBuild
} }
pure $ updateLbi lbi' 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

View File

@ -1,6 +1,6 @@
packages: packages:
zcash-haskell/zcash-haskell.cabal
./*.cabal ./*.cabal
zcash-haskell/zcash-haskell.cabal
with-compiler: ghc-9.4.8 with-compiler: ghc-9.4.8

6
configure vendored Executable file
View File

@ -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

@ -1 +1 @@
Subproject commit ef93147f22a72cf3a5ffc2db686626d75704024a Subproject commit 419f041ca9d1dd921673721c56a673fe1dc058e8

View File

@ -1,6 +1,6 @@
cabal-version: 3.0 cabal-version: 3.0
name: zenith name: zenith
version: 0.4.2.1 version: 0.4.3.0
license: MIT license: MIT
license-file: LICENSE license-file: LICENSE
author: Rene Vergara author: Rene Vergara
@ -18,10 +18,12 @@ common warnings
custom-setup custom-setup
setup-depends: setup-depends:
base >= 4.7 && < 5 base >= 4.12 && < 5
, Cabal >= 3.0.0.0 , Cabal >= 3.2.0.0
, directory >= 1.3.6.0 , directory >= 1.3.6.0
, filepath >= 1.3.0.2 , filepath >= 1.3.0.2
, regex-base
, regex-compat
library library
import: warnings import: warnings
@ -39,7 +41,7 @@ library
Clipboard Clipboard
, aeson , aeson
, array , array
, base >=4.7 && <5 , base >=4.12 && <5
, base64-bytestring , base64-bytestring
, brick , brick
, bytestring , bytestring
@ -63,7 +65,7 @@ library
, vty , vty
, zcash-haskell , zcash-haskell
--pkgconfig-depends: rustzcash_wrapper --pkgconfig-depends: rustzcash_wrapper
default-language: GHC2021 default-language: Haskell2010
executable zenith executable zenith
import: warnings import: warnings
@ -71,7 +73,7 @@ executable zenith
hs-source-dirs: hs-source-dirs:
app app
build-depends: build-depends:
base >=4.7 && <5 base >=4.12 && <5
, brick , brick
, bytestring , bytestring
, configurator , configurator
@ -81,8 +83,9 @@ executable zenith
, text , text
, time , time
, zenith , zenith
, zcash-haskell
pkgconfig-depends: rustzcash_wrapper pkgconfig-depends: rustzcash_wrapper
default-language: GHC2021 default-language: Haskell2010
test-suite zenith-tests test-suite zenith-tests
import: warnings import: warnings
@ -91,7 +94,7 @@ test-suite zenith-tests
hs-source-dirs: hs-source-dirs:
test test
build-depends: build-depends:
base >=4.7 && <5 base >=4.12 && <5
, bytestring , bytestring
, configurator , configurator
, data-default , data-default
@ -104,4 +107,4 @@ test-suite zenith-tests
, zcash-haskell , zcash-haskell
, zenith , zenith
pkgconfig-depends: rustzcash_wrapper pkgconfig-depends: rustzcash_wrapper
default-language: GHC2021 default-language: Haskell2010