packages feed

constraints-deriving-1.0.3.0: Setup.hs

{-
Here is a very unfortunate hack that allows me to re-export modules of
the "constraints" library if flag "constraints" is enabled.

I have to do this because:

 * if flag "constraints" is disabled, the library exports its own modules
   (copied from the "constraints" library, thus the same API);

 * if I add reexported-modules in the package description, cabal check
   complains for duplicate modules
   (even though they are under mutually exclusive conditions);

 * I still want library users import the modules without PackageImports or alike
   independently of their choice of flags.
 -}
{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE CPP #-}

#ifndef MIN_VERSION_Cabal
#define MIN_VERSION_Cabal(x,y,z) 0
#endif

module Main (main) where

import Distribution.PackageDescription
import Distribution.Simple
import qualified Distribution.ModuleName as ModuleName
#if MIN_VERSION_Cabal(2,0,0)
import Distribution.Types.CondTree (CondBranch(CondBranch))
#endif

main :: IO ()
main = defaultMainWithHooks simpleUserHooks
  { confHook = \(gpd, hbi) -> confHook simpleUserHooks (addReexportsGPD gpd, hbi) }

addReexportsGPD :: GenericPackageDescription -> GenericPackageDescription
addReexportsGPD gpd = gpd { condLibrary = addReexportsCT <$> condLibrary gpd }


addReexportsCT :: CondTree ConfVar [Dependency] Library
               -> CondTree ConfVar [Dependency] Library
addReexportsCT ct = ct
    { condTreeComponents = reexportBranch : condTreeComponents ct }
  where
    constraintsCondition = Var (Flag (mkFlagName "constraints"))
    reexportContent   = mempty
      { reexportedModules =
         [ ModuleReexport
             { moduleReexportOriginalPackage = Just (mkPackageName "constraints")
             , moduleReexportOriginalName = ModuleName.fromString "Data.Constraint"
             , moduleReexportName = ModuleName.fromString "Data.Constraint"
             }
         , ModuleReexport
             { moduleReexportOriginalPackage = Just (mkPackageName "constraints")
             , moduleReexportOriginalName = ModuleName.fromString "Data.Constraint.Unsafe"
             , moduleReexportName = ModuleName.fromString "Data.Constraint.Unsafe"
             }
         ]
      }
    constraintsTrueTree = CondNode
      { condTreeData        = reexportContent
      , condTreeConstraints = []
      , condTreeComponents  = []
      }
    constraintsFalseTree = Nothing
    reexportBranch =
#if MIN_VERSION_Cabal(2,0,0)
      CondBranch
#else
      (,,)
#endif
        constraintsCondition constraintsTrueTree constraintsFalseTree

#if !MIN_VERSION_Cabal(2,0,0)
mkFlagName :: String -> FlagName
mkFlagName = FlagName

mkPackageName :: String -> PackageName
mkPackageName = PackageName
#endif