Skip to content

Commit

Permalink
Use custom build and config hook.
Browse files Browse the repository at this point in the history
  This is necessary and useful for two reasons:

  1. It removes the need of pre-building the Rust library beforehand. It
     is now done as part of the Haskell build itself.

  2. It works around Cabal's limitation of not begin able to refer to an
     extra C library using a relative path. See also: (haskell/cabal#2641)
  • Loading branch information
KtorZ committed Sep 26, 2023
1 parent 0a134b2 commit cc87462
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 3 deletions.
70 changes: 70 additions & 0 deletions cddl/Setup.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import Prelude

import Data.Maybe
( fromJust
)
import Distribution.Simple
( Args
, UserHooks (..)
, defaultMainWithHooks
, simpleUserHooks
)
import Distribution.Simple.LocalBuildInfo
( LocalBuildInfo (..),
)
import Distribution.Simple.Setup
( BuildFlags (..)
, ConfigFlags (..)
, fromFlag
)
import Distribution.Simple.UserHooks
( UserHooks (..)
)
import Distribution.Simple.Utils
( rawSystemExit
)
import System.Directory
( getCurrentDirectory
)

import qualified Distribution.PackageDescription as Pkg

main :: IO ()
main =
defaultMainWithHooks
simpleUserHooks
{ confHook = rustConfHook
, buildHook = rustBuildHook
}

rustConfHook
:: (Pkg.GenericPackageDescription, Pkg.HookedBuildInfo)
-> ConfigFlags
-> IO LocalBuildInfo
rustConfHook (description, buildInfo) flags = do
localBuildInfo <- confHook simpleUserHooks (description, buildInfo) flags
let packageDescription = localPkgDescr localBuildInfo
let library = fromJust $ Pkg.library packageDescription
let libraryBuildInfo = Pkg.libBuildInfo library
dir <- getCurrentDirectory
return localBuildInfo
{ localPkgDescr = packageDescription
{ Pkg.library = Just library
{ Pkg.libBuildInfo = libraryBuildInfo
{ Pkg.extraLibDirs = (dir ++ "/target/release") : Pkg.extraLibDirs libraryBuildInfo
}
}
}
}

rustBuildHook
:: Pkg.PackageDescription
-> LocalBuildInfo
-> UserHooks
-> BuildFlags
-> IO ()
rustBuildHook description localBuildInfo hooks flags = do
putStrLn "[🦀] Compiling Rust dependencies..."
putStrLn "[🦀] cargo build --release"
rawSystemExit (fromFlag $ buildVerbosity flags) "cargo" ["build", "--release"]
buildHook simpleUserHooks description localBuildInfo hooks flags
Binary file removed cddl/cbits/libcddl.a
Binary file not shown.
11 changes: 8 additions & 3 deletions cddl/cddl.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,14 @@ author: KtorZ <matthias.benkort@cardanofoundation.org>
maintainer: matthias.benkort@cardanofoundation.org
license: Apache-2.0
license-files: LICENSE
build-type: Simple
extra-source-files: cbits/libcddl.h
build-type: Custom
extra-source-files: Setup.hs
cbits/libcddl.h

custom-setup
setup-depends: , base
, directory
, Cabal

common project-config
default-language: Haskell2010
Expand Down Expand Up @@ -46,7 +52,6 @@ test-suite unit
Paths_cddl
build-depends: , base
, base16-bytestring
, bytestring
, cddl
, hspec
, text
Expand Down

0 comments on commit cc87462

Please sign in to comment.