{-# LANGUAGE OverloadedStrings #-} {-# OPTIONS_GHC -Wall -Wno-deprecations #-} import Data.Foldable import Distribution.Simple import Distribution.Simple.LocalBuildInfo import Distribution.Simple.Toolkit import Distribution.System import Distribution.Types.BuildInfo import Distribution.Types.GenericPackageDescription import Distribution.Types.PackageDescription import System.Directory import System.Environment import System.FilePath main :: IO () main = defaultMainWithHooks simpleUserHooks { hookedPrograms = [cmakeProgram, ninjaProgram] , confHook = \t f -> do lbi <- confHook simpleUserHooks t f let extra_libs = "stdc++" : (case buildOS of Windows -> ["rpcrt4"] _ -> []) [system_rocksdb] = [v | (k, v) <- flagAssignment lbi, k == "system-rocksdb"] if system_rocksdb then pure lbi { localPkgDescr = updatePackageDescription ( Just emptyBuildInfo {extraLibs = "rocksdb" : extra_libs} , []) $ localPkgDescr lbi } else do rocksdb_srcdir <- ( "rocksdb-5.8") <$> getCurrentDirectory let clbi = getComponentLocalBuildInfo lbi CLibName rocksdb_libname = getHSLibraryName (componentUnitId clbi) ++ "-rocksdb-5.8" rocksdb_builddir = componentBuildDir lbi clbi "rocksdb-5.8" lib_installdir = libdir $ getComponentInstallDirs (packageDescription $ fst t) lbi CLibName for_ [rocksdb_builddir, lib_installdir] $ createDirectoryIfMissing True withCurrentDirectory rocksdb_builddir $ do runLBIProgram lbi cmakeProgram [ rocksdb_srcdir , "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true" , "-G" , "Ninja" ] ninja_extra_args <- do r <- lookupEnv "NINJA_J" pure $ case r of Just s -> ["-j", s] _ -> [] runLBIProgram lbi ninjaProgram $ ninja_extra_args ++ ["librocksdb.a"] copyFile "librocksdb.a" $ lib_installdir "lib" ++ rocksdb_libname <.> "a" pure lbi { localPkgDescr = updatePackageDescription ( Just emptyBuildInfo { extraLibs = rocksdb_libname : extra_libs , extraLibDirs = [lib_installdir] } , []) $ localPkgDescr lbi } }