{-# LANGUAGE FlexibleContexts #-}{-# LANGUAGE RankNTypes #-}------------------------------------------------------------------------------- copy :-- $(MAKE) install prefix=$(destdir)/$(prefix) \-- bindir=$(destdir)/$(bindir) \-- |-- Module : Distribution.Make-- Copyright : Martin Sjögren 2004-- License : BSD3---- Maintainer : cabal-devel@haskell.org-- Portability : portable---- This is an alternative build system that delegates everything to the @make@-- program. All the commands just end up calling @make@ with appropriate-- arguments. The intention was to allow preexisting packages that used-- makefiles to be wrapped into Cabal packages. In practice essentially all-- such packages were converted over to the \"Simple\" build system instead.-- Consequently this module is not used much and it certainly only sees cursory-- maintenance and no testing. Perhaps at some point we should stop pretending-- that it works.---- Uses the parsed command-line from "Distribution.Simple.Setup" in order to build-- Haskell tools using a back-end build system based on make. Obviously we-- assume that there is a configure script, and that after the ConfigCmd has-- been run, there is a Makefile. Further assumptions:---- [ConfigCmd] We assume the configure script accepts-- @--with-hc@,-- @--with-hc-pkg@,-- @--prefix@,-- @--bindir@,-- @--libdir@,-- @--libexecdir@,-- @--datadir@.---- [BuildCmd] We assume that the default Makefile target will build everything.---- [InstallCmd] We assume there is an @install@ target. Note that we assume that-- this does *not* register the package!---- [CopyCmd] We assume there is a @copy@ target, and a variable @$(destdir)@.-- The @copy@ target should probably just invoke @make install@-- recursively (e.g. @$(MAKE) install prefix=$(destdir)\/$(prefix)-- bindir=$(destdir)\/$(bindir)@. The reason we can\'t invoke @make-- install@ directly here is that we don\'t know the value of @$(prefix)@.---- [SDistCmd] We assume there is a @dist@ target.---- [RegisterCmd] We assume there is a @register@ target and a variable @$(user)@.---- [UnregisterCmd] We assume there is an @unregister@ target.---- [HaddockCmd] We assume there is a @docs@ or @doc@ target.moduleDistribution.Make(moduleDistribution.Package,License(..),Version,defaultMain ,defaultMainArgs )whereimportDistribution.Compat.PreludeimportPrelude()-- localimportDistribution.LicenseimportDistribution.PackageimportDistribution.PrettyimportDistribution.Simple.Command importDistribution.Simple.Program importDistribution.Simple.Setup importDistribution.Simple.Utils importDistribution.VersionimportSystem.Environment(getArgs,getProgName)defaultMain ::IO()defaultMain :: IO () defaultMain =IO [String] getArgsIO [String] -> ([String] -> IO ()) -> IO () forall a b. IO a -> (a -> IO b) -> IO b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>=[String] -> IO () defaultMainArgs defaultMainArgs ::[String]->IO()defaultMainArgs :: [String] -> IO () defaultMainArgs =[String] -> IO () defaultMainHelper defaultMainHelper ::[String]->IO()defaultMainHelper :: [String] -> IO () defaultMainHelper [String] args =doCommandParse (GlobalFlags, CommandParse (IO ())) command <-CommandUI GlobalFlags -> [Command (IO ())] -> [String] -> IO (CommandParse (GlobalFlags, CommandParse (IO ()))) forall a action. CommandUI a -> [Command action] -> [String] -> IO (CommandParse (a, CommandParse action)) commandsRun ([Command (IO ())] -> CommandUI GlobalFlags forall action. [Command action] -> CommandUI GlobalFlags globalCommand [Command (IO ())] commands )[Command (IO ())] commands [String] args caseCommandParse (GlobalFlags, CommandParse (IO ())) command ofCommandHelp String -> String help ->(String -> String) -> IO () printHelp String -> String help CommandList [String] opts ->[String] -> IO () printOptionsList [String] opts CommandErrors [String] errs ->[String] -> IO () forall {b}. [String] -> IO b printErrors [String] errs CommandReadyToGo (GlobalFlags flags ,CommandParse (IO ()) commandParse )->caseCommandParse (IO ()) commandParse ofCommandParse (IO ()) _|Flag Bool -> Bool forall a. WithCallStack (Flag a -> a) fromFlag (GlobalFlags -> Flag Bool globalVersion GlobalFlags flags )->IO () printVersion |Flag Bool -> Bool forall a. WithCallStack (Flag a -> a) fromFlag (GlobalFlags -> Flag Bool globalNumericVersion GlobalFlags flags )->IO () printNumericVersion CommandHelp String -> String help ->(String -> String) -> IO () printHelp String -> String help CommandList [String] opts ->[String] -> IO () printOptionsList [String] opts CommandErrors [String] errs ->[String] -> IO () forall {b}. [String] -> IO b printErrors [String] errs CommandReadyToGo IO () action ->IO () action whereprintHelp :: (String -> String) -> IO () printHelp String -> String help =IO String getProgNameIO String -> (String -> IO ()) -> IO () forall a b. IO a -> (a -> IO b) -> IO b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>=String -> IO () putStr(String -> IO ()) -> (String -> String) -> String -> IO () forall b c a. (b -> c) -> (a -> b) -> a -> c .String -> String help printOptionsList :: [String] -> IO () printOptionsList =String -> IO () putStr(String -> IO ()) -> ([String] -> String) -> [String] -> IO () forall b c a. (b -> c) -> (a -> b) -> a -> c .[String] -> String unlinesprintErrors :: [String] -> IO b printErrors [String] errs =doString -> IO () putStr(String -> [String] -> String forall a. [a] -> [[a]] -> [a] intercalateString "\n"[String] errs )ExitCode -> IO b forall a. ExitCode -> IO a exitWith(Int -> ExitCode ExitFailureInt 1)printNumericVersion :: IO () printNumericVersion =String -> IO () putStrLn(String -> IO ()) -> String -> IO () forall a b. (a -> b) -> a -> b $Version -> String forall a. Pretty a => a -> String prettyShowVersion cabalVersion printVersion :: IO () printVersion =String -> IO () putStrLn(String -> IO ()) -> String -> IO () forall a b. (a -> b) -> a -> b $String "Cabal library version "String -> String -> String forall a. [a] -> [a] -> [a] ++Version -> String forall a. Pretty a => a -> String prettyShowVersion cabalVersion progs :: ProgramDb progs =ProgramDb defaultProgramDb commands :: [Command (IO ())] commands =[ProgramDb -> CommandUI ConfigFlags configureCommand ProgramDb progs CommandUI ConfigFlags -> (ConfigFlags -> [String] -> IO ()) -> Command (IO ()) forall flags action. CommandUI flags -> (flags -> [String] -> action) -> Command action `commandAddAction` ConfigFlags -> [String] -> IO () configureAction ,ProgramDb -> CommandUI BuildFlags buildCommand ProgramDb progs CommandUI BuildFlags -> (BuildFlags -> [String] -> IO ()) -> Command (IO ()) forall flags action. CommandUI flags -> (flags -> [String] -> action) -> Command action `commandAddAction` BuildFlags -> [String] -> IO () buildAction ,CommandUI InstallFlags installCommand CommandUI InstallFlags -> (InstallFlags -> [String] -> IO ()) -> Command (IO ()) forall flags action. CommandUI flags -> (flags -> [String] -> action) -> Command action `commandAddAction` InstallFlags -> [String] -> IO () installAction ,CommandUI CopyFlags copyCommand CommandUI CopyFlags -> (CopyFlags -> [String] -> IO ()) -> Command (IO ()) forall flags action. CommandUI flags -> (flags -> [String] -> action) -> Command action `commandAddAction` CopyFlags -> [String] -> IO () copyAction ,CommandUI HaddockFlags haddockCommand CommandUI HaddockFlags -> (HaddockFlags -> [String] -> IO ()) -> Command (IO ()) forall flags action. CommandUI flags -> (flags -> [String] -> action) -> Command action `commandAddAction` HaddockFlags -> [String] -> IO () haddockAction ,CommandUI CleanFlags cleanCommand CommandUI CleanFlags -> (CleanFlags -> [String] -> IO ()) -> Command (IO ()) forall flags action. CommandUI flags -> (flags -> [String] -> action) -> Command action `commandAddAction` CleanFlags -> [String] -> IO () cleanAction ,CommandUI SDistFlags sdistCommand CommandUI SDistFlags -> (SDistFlags -> [String] -> IO ()) -> Command (IO ()) forall flags action. CommandUI flags -> (flags -> [String] -> action) -> Command action `commandAddAction` SDistFlags -> [String] -> IO () sdistAction ,CommandUI RegisterFlags registerCommand CommandUI RegisterFlags -> (RegisterFlags -> [String] -> IO ()) -> Command (IO ()) forall flags action. CommandUI flags -> (flags -> [String] -> action) -> Command action `commandAddAction` RegisterFlags -> [String] -> IO () registerAction ,CommandUI RegisterFlags unregisterCommand CommandUI RegisterFlags -> (RegisterFlags -> [String] -> IO ()) -> Command (IO ()) forall flags action. CommandUI flags -> (flags -> [String] -> action) -> Command action `commandAddAction` RegisterFlags -> [String] -> IO () unregisterAction ]configureAction ::ConfigFlags ->[String]->IO()configureAction :: ConfigFlags -> [String] -> IO () configureAction ConfigFlags flags [String] args =do[String] -> IO () noExtraFlags [String] args letverbosity :: Verbosity verbosity =Flag Verbosity -> Verbosity forall a. WithCallStack (Flag a -> a) fromFlag (Flag Verbosity -> Verbosity) -> Flag Verbosity -> Verbosity forall a b. (a -> b) -> a -> b $ConfigFlags -> Flag Verbosity configVerbosity ConfigFlags flags mbWorkDir :: Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir =Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a. Flag a -> Maybe a flagToMaybe (Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg))) -> Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a b. (a -> b) -> a -> b $ConfigFlags -> Flag (SymbolicPath CWD ('Dir Pkg)) configWorkingDir ConfigFlags flags Verbosity -> Maybe (SymbolicPath CWD ('Dir Pkg)) -> String -> [String] -> IO () rawSystemExit Verbosity verbosity Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir String "sh"([String] -> IO ()) -> [String] -> IO () forall a b. (a -> b) -> a -> b $String "configure"String -> [String] -> [String] forall a. a -> [a] -> [a] :Bool -> ConfigFlags -> [String] configureArgs Bool backwardsCompatHack ConfigFlags flags wherebackwardsCompatHack :: Bool backwardsCompatHack =Bool TruecopyAction ::CopyFlags ->[String]->IO()copyAction :: CopyFlags -> [String] -> IO () copyAction CopyFlags flags [String] args =do[String] -> IO () noExtraFlags [String] args letverbosity :: Verbosity verbosity =Flag Verbosity -> Verbosity forall a. WithCallStack (Flag a -> a) fromFlag (Flag Verbosity -> Verbosity) -> Flag Verbosity -> Verbosity forall a b. (a -> b) -> a -> b $CopyFlags -> Flag Verbosity copyVerbosity CopyFlags flags mbWorkDir :: Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir =Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a. Flag a -> Maybe a flagToMaybe (Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg))) -> Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a b. (a -> b) -> a -> b $CopyFlags -> Flag (SymbolicPath CWD ('Dir Pkg)) copyWorkingDir CopyFlags flags destArgs :: [String] destArgs =caseFlag CopyDest -> CopyDest forall a. WithCallStack (Flag a -> a) fromFlag (Flag CopyDest -> CopyDest) -> Flag CopyDest -> CopyDest forall a b. (a -> b) -> a -> b $CopyFlags -> Flag CopyDest copyDest CopyFlags flags ofCopyDest NoCopyDest ->[String "install"]CopyTo String path ->[String "copy",String "destdir="String -> String -> String forall a. [a] -> [a] -> [a] ++String path ]CopyToDb String _->String -> [String] forall a. HasCallStack => String -> a errorString "CopyToDb not supported via Make"Verbosity -> Maybe (SymbolicPath CWD ('Dir Pkg)) -> String -> [String] -> IO () rawSystemExit Verbosity verbosity Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir String "make"[String] destArgs installAction ::InstallFlags ->[String]->IO()installAction :: InstallFlags -> [String] -> IO () installAction InstallFlags flags [String] args =do[String] -> IO () noExtraFlags [String] args letverbosity :: Verbosity verbosity =Flag Verbosity -> Verbosity forall a. WithCallStack (Flag a -> a) fromFlag (Flag Verbosity -> Verbosity) -> Flag Verbosity -> Verbosity forall a b. (a -> b) -> a -> b $InstallFlags -> Flag Verbosity installVerbosity InstallFlags flags mbWorkDir :: Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir =Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a. Flag a -> Maybe a flagToMaybe (Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg))) -> Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a b. (a -> b) -> a -> b $InstallFlags -> Flag (SymbolicPath CWD ('Dir Pkg)) installWorkingDir InstallFlags flags Verbosity -> Maybe (SymbolicPath CWD ('Dir Pkg)) -> String -> [String] -> IO () rawSystemExit Verbosity verbosity Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir String "make"[String "install"]Verbosity -> Maybe (SymbolicPath CWD ('Dir Pkg)) -> String -> [String] -> IO () rawSystemExit Verbosity verbosity Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir String "make"[String "register"]haddockAction ::HaddockFlags ->[String]->IO()haddockAction :: HaddockFlags -> [String] -> IO () haddockAction HaddockFlags flags [String] args =do[String] -> IO () noExtraFlags [String] args letverbosity :: Verbosity verbosity =Flag Verbosity -> Verbosity forall a. WithCallStack (Flag a -> a) fromFlag (Flag Verbosity -> Verbosity) -> Flag Verbosity -> Verbosity forall a b. (a -> b) -> a -> b $HaddockFlags -> Flag Verbosity haddockVerbosity HaddockFlags flags mbWorkDir :: Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir =Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a. Flag a -> Maybe a flagToMaybe (Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg))) -> Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a b. (a -> b) -> a -> b $HaddockFlags -> Flag (SymbolicPath CWD ('Dir Pkg)) haddockWorkingDir HaddockFlags flags Verbosity -> Maybe (SymbolicPath CWD ('Dir Pkg)) -> String -> [String] -> IO () rawSystemExit Verbosity verbosity Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir String "make"[String "docs"]IO () -> (IOException -> IO ()) -> IO () forall a. IO a -> (IOException -> IO a) -> IO a `catchIO`\IOException _->Verbosity -> Maybe (SymbolicPath CWD ('Dir Pkg)) -> String -> [String] -> IO () rawSystemExit Verbosity verbosity Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir String "make"[String "doc"]buildAction ::BuildFlags ->[String]->IO()buildAction :: BuildFlags -> [String] -> IO () buildAction BuildFlags flags [String] args =do[String] -> IO () noExtraFlags [String] args letverbosity :: Verbosity verbosity =Flag Verbosity -> Verbosity forall a. WithCallStack (Flag a -> a) fromFlag (Flag Verbosity -> Verbosity) -> Flag Verbosity -> Verbosity forall a b. (a -> b) -> a -> b $BuildFlags -> Flag Verbosity buildVerbosity BuildFlags flags mbWorkDir :: Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir =Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a. Flag a -> Maybe a flagToMaybe (Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg))) -> Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a b. (a -> b) -> a -> b $BuildFlags -> Flag (SymbolicPath CWD ('Dir Pkg)) buildWorkingDir BuildFlags flags Verbosity -> Maybe (SymbolicPath CWD ('Dir Pkg)) -> String -> [String] -> IO () rawSystemExit Verbosity verbosity Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir String "make"[]cleanAction ::CleanFlags ->[String]->IO()cleanAction :: CleanFlags -> [String] -> IO () cleanAction CleanFlags flags [String] args =do[String] -> IO () noExtraFlags [String] args letverbosity :: Verbosity verbosity =Flag Verbosity -> Verbosity forall a. WithCallStack (Flag a -> a) fromFlag (Flag Verbosity -> Verbosity) -> Flag Verbosity -> Verbosity forall a b. (a -> b) -> a -> b $CleanFlags -> Flag Verbosity cleanVerbosity CleanFlags flags mbWorkDir :: Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir =Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a. Flag a -> Maybe a flagToMaybe (Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg))) -> Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a b. (a -> b) -> a -> b $CleanFlags -> Flag (SymbolicPath CWD ('Dir Pkg)) cleanWorkingDir CleanFlags flags Verbosity -> Maybe (SymbolicPath CWD ('Dir Pkg)) -> String -> [String] -> IO () rawSystemExit Verbosity verbosity Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir String "make"[String "clean"]sdistAction ::SDistFlags ->[String]->IO()sdistAction :: SDistFlags -> [String] -> IO () sdistAction SDistFlags flags [String] args =do[String] -> IO () noExtraFlags [String] args letverbosity :: Verbosity verbosity =Flag Verbosity -> Verbosity forall a. WithCallStack (Flag a -> a) fromFlag (Flag Verbosity -> Verbosity) -> Flag Verbosity -> Verbosity forall a b. (a -> b) -> a -> b $SDistFlags -> Flag Verbosity sDistVerbosity SDistFlags flags mbWorkDir :: Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir =Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a. Flag a -> Maybe a flagToMaybe (Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg))) -> Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a b. (a -> b) -> a -> b $SDistFlags -> Flag (SymbolicPath CWD ('Dir Pkg)) sDistWorkingDir SDistFlags flags Verbosity -> Maybe (SymbolicPath CWD ('Dir Pkg)) -> String -> [String] -> IO () rawSystemExit Verbosity verbosity Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir String "make"[String "dist"]registerAction ::RegisterFlags ->[String]->IO()registerAction :: RegisterFlags -> [String] -> IO () registerAction RegisterFlags flags [String] args =do[String] -> IO () noExtraFlags [String] args letverbosity :: Verbosity verbosity =Flag Verbosity -> Verbosity forall a. WithCallStack (Flag a -> a) fromFlag (Flag Verbosity -> Verbosity) -> Flag Verbosity -> Verbosity forall a b. (a -> b) -> a -> b $RegisterFlags -> Flag Verbosity registerVerbosity RegisterFlags flags mbWorkDir :: Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir =Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a. Flag a -> Maybe a flagToMaybe (Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg))) -> Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a b. (a -> b) -> a -> b $RegisterFlags -> Flag (SymbolicPath CWD ('Dir Pkg)) registerWorkingDir RegisterFlags flags Verbosity -> Maybe (SymbolicPath CWD ('Dir Pkg)) -> String -> [String] -> IO () rawSystemExit Verbosity verbosity Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir String "make"[String "register"]unregisterAction ::RegisterFlags ->[String]->IO()unregisterAction :: RegisterFlags -> [String] -> IO () unregisterAction RegisterFlags flags [String] args =do[String] -> IO () noExtraFlags [String] args letverbosity :: Verbosity verbosity =Flag Verbosity -> Verbosity forall a. WithCallStack (Flag a -> a) fromFlag (Flag Verbosity -> Verbosity) -> Flag Verbosity -> Verbosity forall a b. (a -> b) -> a -> b $RegisterFlags -> Flag Verbosity registerVerbosity RegisterFlags flags mbWorkDir :: Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir =Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a. Flag a -> Maybe a flagToMaybe (Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg))) -> Flag (SymbolicPath CWD ('Dir Pkg)) -> Maybe (SymbolicPath CWD ('Dir Pkg)) forall a b. (a -> b) -> a -> b $RegisterFlags -> Flag (SymbolicPath CWD ('Dir Pkg)) registerWorkingDir RegisterFlags flags Verbosity -> Maybe (SymbolicPath CWD ('Dir Pkg)) -> String -> [String] -> IO () rawSystemExit Verbosity verbosity Maybe (SymbolicPath CWD ('Dir Pkg)) mbWorkDir String "make"[String "unregister"]