packages feed

direct-rocksdb-0.0.3: Setup.hs

{-# 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
                }
    }